在 JavaScript 中, 函數有兩種調用方式:數組
function sum(x, y) {
return x + y
}
// 第一種方式
sum(1, 2) // 3
// 第二種方式
sum.call(undefined, 1, 2) // 3
複製代碼
第一種方式是經常使用的方法調用函數,第二種是使用 call()
方法調用函數,在使用後者調用函數時,第一個參數即是 this
值。瀏覽器
不管是否在嚴格模式下,在全局執行環境中(在任何函數體外部)this
都指向全局對象。bash
// 在瀏覽器中, window 對象同時也是全局對象
console.log(this === window) // true
a = 37
console.log(window.a) // 37
this.b = "你好"
console.log(window.b) // "你好"
console.log(b) // "你好"
複製代碼
由於下面的代碼不在嚴格模式下,且 this
的值不是由該調用設置的,因此 this
的值默認指向全局對象。函數
function f1(){
return this
}
//在瀏覽器中:
f1() === window //在瀏覽器中,全局對象是window
複製代碼
然而,在嚴格模式下,this
將保持他進入執行環境時的值,因此下面的 this
將會默認爲 undefined
。ui
function f2(){
"use strict" // 這裏是嚴格模式
return this
}
f2() === undefined // true
複製代碼
仍是最上面的例子。
若是函數以 ()
的方式調用,那麼 arguments
就是由全部參數組成的僞數組。
若是函數以 call()
的方式調用,那麼 arguments
指的就是第二個及以後的參數組成的僞數組。
須要注意的是,在非嚴格模式下,arguments
能夠被修改。this
// 非嚴格模式
function sum(x, y) {
arguments[0] = 100
arguments[1] = 100
return x + y
}
sum(1, 2) // 200
sum.call(undefined, 1, 2) // 200
// 嚴格模式
function sum(x, y) {
'use strict'
arguments[0] = 100
arguments[1] = 100
return x + y
}
sum(1, 2) // 3
sum.call(undefined, 1, 2) // 3
複製代碼