国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

詳解JS中的this、apply、call、bind(經典面試題)

2024-05-06 15:26:29
字體:
來源:轉載
供稿:網友

這又是一個面試經典問題~/(ㄒoㄒ)/~~也是 ES5中眾多坑中的一個,在 ES6 中可能會極大避免 this 產生的錯誤,但是為了一些老代碼的維護,最好還是了解一下 this 的指向和 call、apply、bind 三者的區別。

this 的指向

在 ES5 中,其實 this 的指向,始終堅持一個原理:this 永遠指向最后調用它的那個對象,來,跟著我朗讀三遍:this 永遠指向最后調用它的那個對象,this 永遠指向最后調用它的那個對象,this 永遠指向最后調用它的那個對象。記住這句話,this 你已經了解一半了。

下面我們來看一個最簡單的例子:

例 1:

 var name = "windowsName"; function a() {  var name = "Cherry";  console.log(this.name);   // windowsName  console.log("inner:" + this); // inner: Window } a(); console.log("outer:" + this)   // outer: Window

這個相信大家都知道為什么 log 的是 windowsName,因為根據剛剛的那句話“this 永遠指向最后調用它的那個對象”,我們看最后調用 a 的地方 a();,前面沒有調用的對象那么就是全局對象 window,這就相當于是 window.a();注意,這里我們沒有使用嚴格模式,如果使用嚴格模式的話,全局對象就是 undefined,那么就會報錯 Uncaught TypeError: Cannot read property 'name' of undefined。

再看下這個例子:

例 2:

var name = "windowsName"; var a = {  name: "Cherry",  fn : function () {   console.log(this.name);  // Cherry  } } a.fn();

在這個例子中,函數 fn 是對象 a 調用的,所以打印的值就是 a 中的 name 的值。是不是有一點清晰了呢~

我們做一個小小的改動:

例 3:

var name = "windowsName"; var a = {  name: "Cherry",  fn : function () {   console.log(this.name);  // Cherry  } } window.a.fn();

這里打印 Cherry 的原因也是因為剛剛那句話“this 永遠指向最后調用它的那個對象”,最后調用它的對象仍然是對象 a。

我們再來看一下這個例子:

例 4:

 var name = "windowsName"; var a = {  // name: "Cherry",  fn : function () {   console.log(this.name);  // undefined  } } window.a.fn();

這里為什么會打印 undefined 呢?這是因為正如剛剛所描述的那樣,調用 fn 的是 a 對象,也就是說 fn 的內部的 this 是對象 a,而對象 a 中并沒有對 name 進行定義,所以 log 的 this.name 的值是 undefined。

這個例子還是說明了:this 永遠指向最后調用它的那個對象,因為最后調用 fn 的對象是 a,所以就算 a 中沒有 name 這個屬性,也不會繼續向上一個對象尋找 this.name,而是直接輸出 undefined。

再來看一個比較坑的例子:

例 5:

 var name = "windowsName"; var a = {  name : null,  // name: "Cherry",  fn : function () {   console.log(this.name);  // windowsName  } } var f = a.fn; f();            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 桂林市| 乌审旗| 上饶县| 镇雄县| 巴南区| 防城港市| 本溪市| 丹凤县| 潞西市| 独山县| 黑河市| 永胜县| 宝鸡市| 枣强县| 福鼎市| 昌宁县| 泌阳县| 蕉岭县| 普格县| 平罗县| 黄平县| 麻江县| 大新县| 闻喜县| 拜城县| 小金县| 绥德县| 夏邑县| 阿尔山市| 临潭县| 胶州市| 灵台县| 金山区| 乐至县| 泾源县| 思茅市| 济宁市| 兰考县| 林口县| 藁城市| 独山县|