js 中的this

與其餘語言相比,函數this在 JavaScript 中的表現略有不一樣,此外,在嚴格模式和非嚴格模式之間也會有一些差異.在絕大多數狀況下,函數的調用方式決定了this的值。this不能在執行期間被賦值,而且在每次函數被調用時this的值也可能會不一樣。ES5引入了bind方法來設置函數的this值,而不用考慮函數如何被調用的,ES2015 引入了支持this詞法解析的箭頭函數(它在閉合的執行上下文內設置this的值)。瀏覽器

(1)不管是否在嚴格模式下,在全局執行上下文中(在任何函數體外部)this 都指代全局對象。app

// 在瀏覽器中, window 對象同時也是全局對象:
console.log(this === window); // true

a = 37;
console.log(window.a); // 37
(2)在函數內部,this的值取決於函數被調用的方式函數

function f1(){
  return this;
}
//在瀏覽器中:
f1() === window; //在瀏覽器中,全局對象是window

//在Node中:
f1() === global;this


然而,在嚴格模式下,this將保持他進入執行上下文時的值,因此下面的this將會默認爲undefined。prototype

function f2(){
  "use strict"; // 這裏是嚴格模式
  return this;
}

f2() === undefined; // true對象


若是要想把 this 的值從一個上下文傳到另外一個,就要用 call 或者apply 方法。繼承

// 將一個對象做爲call和apply的第一個參數,this會被綁定到這個對象。
var obj = {a: 'Custom'};

// 這個屬性是在global對象定義的。
var a = 'Global';

function whatsThis(arg) {
return this.a; // this的值取決於函數的調用方式
}

whatsThis(); // 'Global'
whatsThis.call(obj); // 'Custom'
whatsThis.apply(obj); // 'Custom'
當一個函數在其主體中使用 this 關鍵字時,能夠經過使用函數繼承自Function.prototype 的 call 或 apply 方法將 this 值綁定到調用中的特定對象。ip

相關文章
相關標籤/搜索