call和apply的第一個參數是null/undefined時函數內的的this指向window或global
call/apply用來改變函數的執行上下文(this),它們的第一個參數thisArg是個對象,即做爲函數內的this。
多數時候你傳啥函數內就是啥。僅以call示例
1
2
3
4
5
6
7
|
function
fun() {
alert(
this
);
}
fun.call(1);
fun.call(
'a'
);
fun.call(
true
);
fun.call({name:
'jack'
});
|
分別彈出「1」、「a」、「true」、「[object Object]」。
有兩種狀況須要注意,傳null或undefined時,將是JS執行環境的全局變量。瀏覽器中是window,其它環境(如node)則是global。
1
2
|
fun.call(
null
);
// window or global
fun.call(undefined);
// window or global
|
這在ECMAScript5.1 15.3.4.4中有解釋,以下
嚴格模式下狀況又有所不一樣,ES3比較寬容儘可能去揣測代碼意圖。ES5嚴格模式(ie6/7/8/9除外)則再也不揣測,給call/apply傳入的任何參數再也不轉換。以下
1
2
3
4
5
6
|
'use strict'
function
fun() {
alert(
this
);
}
fun.call(
null
)
// null
fun.call(undefined)
// undefined
|
須注意!