1.通常情況下
“ this
對象是在運行時基于函數(shù)的執(zhí)行環(huán)境綁定的软免。在全局函數(shù)中,this
等于 Window
;而當函數(shù)被作為某個對象的方法調(diào)用時,this 等于那個對象卤妒∩蹋”
// 代碼示例 1
function myContext() {
console.log(this);
}
myContext();
// Window {postMessage: ?, blur: ?, focus: ?, close: ?, parent: Window, …}
let obj1 = {
name: 'obj1',
myContext: function() {
console.log(this);
}
}
obj1.myContext();
// {name: "obj1", myContext: ?}
2.匿名函數(shù)中
匿名函數(shù)的執(zhí)行環(huán)境具有全局性,因此其 this 對象通常指向 Window
则披。
// 代碼示例 2
var obj = {
name: 'obj',
myContext: function() {
return function() {
console.log(this);
}
}
}
obj.myContext()();
// Window {postMessage: ?, blur: ?, focus: ?, close: ?, parent: Window, …}
3.閉包訪問
閉包(匿名函數(shù))情況下共缕,如果想訪問作用域中的 arguments
對象,必須將該對象的引用保存到另一個閉包能夠訪問的變量中士复。
// 代碼示例 3
var name = 'window';
var obj = {
name: 'obj',
myContext: function() {
return function() {
console.log(this.name);
}
}
}
obj.myContext()();
// window
var obj = {
name: 'obj',
myContext: function() {
var that = this;
return function() {
console.log(that.name);
}
}
}
obj.myContext()();
// obj
4.特殊情況
// 代碼示例 4
var name = 'The Window';
var obj = {
name: 'obj',
getName: function() {
console.log(this.name);
}
}
obj.getName();
// obj
(obj.getName = obj.getName)();
// The Window
上述代碼示例 4 中兩次執(zhí)行結(jié)果不同图谷。第二次執(zhí)行的代碼先執(zhí)行了一條賦值語句,然后再調(diào)用賦值后的結(jié)果阱洪。因為這個賦值表達式的值是函數(shù)本身便贵,所以 this
的值不能得到維持。???????????????
總結(jié)
一般情況下冗荸,this
對象的指向是由當前執(zhí)行環(huán)境決定的承璃。而匿名函數(shù)(閉包)的執(zhí)行環(huán)境具有全局性,所以如果想要訪問作用域中的 arguments
對象俏竞,可以將該對象的引用保存到閉包可以訪問到的變量中绸硕。
同時要注意,語法的細微變化魂毁,都可能意外改變 this
的指向玻佩。
注:文章參考總結(jié)自 《JavaScript 高級程序設(shè)計》(第 3 版)[美] Nicholas C.Zakas 著 第 182 頁。