作者:李挺
鏈接:https://www.zhihu.com/question/19636194/answer/123274198
來源:知乎
著作權歸作者所有,轉載請聯系作者獲得授權。
鏈接:https://www.zhihu.com/question/19636194/answer/123274198
來源:知乎
著作權歸作者所有,轉載請聯系作者獲得授權。
關于 this 的描述,曾經在 stackoverflow 上看到了一篇回答寫的非常詳盡,下面的文字是一個簡單的總結:
(一)定義:是一個關鍵字,用來計算當前執行上下文中 ThisBinding 的值。
(二)ThisBinding 的值(this 的計算結果):
注解:
引用:
(一)定義:是一個關鍵字,用來計算當前執行上下文中 ThisBinding 的值。
- 定義推斷:作為一個關鍵字,既不是變量,又不是對象屬性,因此不能給 this 賦值,而且 this 也不受作用域的限制,嵌套函數中的 this 不會從調用它的函數中繼承 this。
(二)ThisBinding 的值(this 的計算結果):
- 全局執行上下文中——global 對象
- eval() 中
- 如果 eval() 是直接調用,那么 Thisbinding 的值取決于 eval() 所處的執行上下文;
- 如果是間接調用,那么 ThisBinding 的值為 global 對象;【注1】
- 作為普通的函數調用,為 global(非嚴格模式下)或 undefined (嚴格模式下);
- 作為某個對象的方法調用,那么 ThisBinding 的值就是這個對象;
- 作為構造函數調用,ThisBinding 的值為所創建的新的空對象;【注2】
- 間接調用下,有八種函數可以在參數中指定 ThisBinding 的值
Function.prototype.apply(thisArg, argArray);
Function.prototype.call(thisArg[, arg1[, arg2, ...]]);
Function.prototype.bind(thisArg[, arg1[, arg2, ...]]);
Array.prototype.every(callbackfn[, thisArg]);
Array.prototype.some(callbackfn[, thisArg]);
Array.prototype.forEach(callbackfn[, thisArg]);
Array.prototype.map(callbackfn[, thisArg]);
Array.prototype.filter(callbackfn[, thisArg]);
- 在 Function.prototype 下的函數,thisArg 指定其主體函數中的 ThisBinding 值;(thisArg 不一定與 ThisBinding 相等【注3】)
- 在 Array.prototype 下的函數,thisArg 指定 callbackfn 中 ThisBinding 的值。
注解:
- eval 是通過表達式計算得到的,那么此時,eval 調用稱之為間接調用,eval 中的代碼在全局環境下執行。(例如:
var x = 'outer'; (function(){ var x = 'inner'; eval('console.log("直接調用: " + x)'); // 直接調用: inner (1, eval)('console.log("間接調用: " + x)'); // 間接調用: outer })();
- 構造函數的調用細節:構造函數調用之前會自動創建一個新的空對象,構造函數作為這個新對象的方法進行調用,所以構造函數通過 this 就可以初始化這個新對象,最后,這個新對象作為構造函數調用表達式的值,構造函數的 prototype 屬性作為新對象的原型。
- 如果這個函數處于非嚴格模式下,則指定為 null 或 undefined 時會自動指向 global 對象,同時如果 thisArg 是原始值的話,那么 ThisBinding 的值原始值的包裝對象。
- eval 是通過表達式計算得到的,那么此時,eval 調用稱之為間接調用,eval 中的代碼在全局環境下執行。(例如:
引用:
- javascript - How does the "this" keyword work?
- (1,eval)('this') vs eval('this') in JavaScript?
- Function.prototype.apply(),Function.prototype.call(),Function.prototype.bind()
- 《JavaScript 權威指南》第六版