首先, 明確一點, 沒有巢狀時, 函式中的this指向它的呼叫者.
巢狀函式, 內部的函式的this指向它的呼叫者=>window(不是外層函式)
var a =
fn();
}};a.f();
window
其次, 函式既可以在當前執行環境中( this指向物件 ), 又可以在全域性環境中( this指向window )
var obj = ,
bar: 1
};var foo = obj.foo;
var bar = 2;
obj.foo() // 1
foo() // 2
或者var foo = function () ;
var bar = 2;
var obj = ,
bar: 1
};obj.foo() // 1
foo() // 2
原因: j**ascript 語言之所以有this的設計,跟記憶體裡面的資料結構有關係。
var obj = ;
j**ascript 引擎會先在記憶體裡面,生成乙個物件,然後把這個物件的記憶體位址賦值給變數obj。
也就是說,變數obj是乙個位址(reference)。後面如果要讀取obj.foo,引擎先從obj拿到記憶體位址,然後再從該位址讀出原始的物件,返回它的foo屬性。
原始的物件以字典結構儲存,每乙個屬性名都對應乙個屬性描述物件。舉例來說,上面例子的foo屬性,實際上是以下面的形式儲存的。
}
當屬性的值是乙個函式。
var obj = };
這時,引擎會將函式單獨儲存在記憶體中,然後再將函式的位址賦值給foo屬性的value屬性。
}
由於函式是乙個單獨的值,所以它可以在不同的環境(上下文)執行。???
var f = function () {};
var obj = ;
// 單獨執行
f()// obj 環境執行
obj.f()
function a()
window.a();或a();//this指向window
var o =
}o.fn();//this指向o
var o =
}}o.b.fn();////this指向b
var obj = ,
bar: () =>
}obj.foo() //
obj.bar() // window
注意: 因為是箭頭函式,所以他的this是obj的this,即呼叫obj的=>window
function fn()
var a = new fn(); //this指向a
console.log(a.user); //追夢子
settimeout(function() ,500)
let $btn = document.getelementbyid('btn');
$btn.onclick = function()
var age=18
var obj=
console.log(obj.age1) //17
只有函式才形成區域性作用域,上面的obj的this實際上是全域性作用域window
JS this指向問題(2)
var color orange window.color red var person function saycolor person.saycolor saycolor person.saycolor.call saycolor undefined person.saycolor.call s...
JS this指向分析
例如 a 在 飯店 吃 餃子 執行主體就是a 上下文就是飯店 吃餃子就是行為 function 吃餃子 a.吃餃子 輸出this 指a function this是誰 和函式在哪定義的和在哪執行的沒有任何關係,就是指執行主體 複製 1 函式執行,首先看函式前面是否有 有的話前面是誰,this就是誰,...
關於js this指向的理解
var obj add1 function a var f v v this.count return f.call b,a add2 function a var f function v return f.call b,a console.log obj.add 1 2 console.log ...