JavaScript有自己的一套this機制,在不同情況下,this的指向也不盡相同。
全域範圍
console.log(this); //全局变量
全域範圍使用this指向的是全域變量,瀏覽器環境下就是window。
註:ECMAScript5的strict模式不存在全域變量,這裡的this是undefined。
函數呼叫中
function foo() { console.log(this); } foo(); //全局变量
函數呼叫中的this也指向全域變數。
註:ECMAScript5的strict模式不存在全域變量,這裡的this是undefined。
物件方法呼叫
var test = { foo: function () { console.log(this); } } test.foo(); //test对象
物件方法呼叫中,this指向呼叫者。
var test = { foo: function () { console.log(this); } } var test2 = test.foo; test2(); //全局变量
不過由於this的晚綁定特性,在上例的情況中this將指向全域變量,相當於直接呼叫函數。
這點非常重要,同樣的程式碼段,只有在執行時才能決定this指向
建構子
function Foo() { console.log(this); } new Foo(); //新创建的对象 console.log(foo);
在建構子內部,this指向新建立的物件。
明確設定this
function foo(a, b) { console.log(this); } var bar = {}; foo.apply(bar, [1, 2]); //bar foo.call(1, 2); //Number对象
使用Function.prototype的call或apply方法是,函數內部this會被設定為傳入的第一個參數。