[英]Function defined with 'this', but executing without 'this'
我期待第二次調用“taco”函數來生成運行時錯誤,因為我沒有使用“this”關鍵字調用它:
function foo() {
var bar = "baz";
this.taco = function() {
console.log(bar);
};
this.taco();
taco(); // I expected a runtime error here.
}
foo();
但事實並非如此。
這是相同代碼的小提琴: http : //jsfiddle.net/phillipkregg/gdFxU/226/
JavaScript是否在這里使用某種類型的隱式上下文管理?
好奇,謝謝!
原因是當你調用foo()
,你在window
對象的范圍內調用它。 這意味着在foo()
內部, this
的值設置為window
。
因此, this.taco()
實際上是window.taco()
,它與taco()
相同。 換句話說, taco()
是一個全局函數,所以當this
是window
時,它可以將其稱為taco()
, window.taco()
或this.taco()
。
如果你將taco()
作為一個像這樣的新對象,其中this
被設置為一個新的foo
實例並且不等於window
,那么你會得到預期的運行時錯誤:
function foo() {
var bar = "baz";
this.taco = function() {
console.log(this);
console.log(bar);
};
this.taco();
taco(); // I expected a runtime error here.
}
var x = new foo();
示例: http : //jsfiddle.net/jfriend00/3LkxU/
如果你感到困惑的價值this
,有確定的值,這些JavaScript規則this
:
如果你調用一個函數new
像x = new foo()
那么一個新的實例foo
創建和值this
設置為對象的內部foo()
函數和新的實例從返回foo()
由默認。
如果你平時調用任何類的函數foo()
則該值this
被設置為全局對象,在瀏覽器window
中的JavaScript的新的“嚴格”的模式,或者如果,那么this
將是undefined
。 這就是您原始示例中發生的情況。
如果調用像一個對象引用的方法obj.foo()
那么this
將被設置成為obj
對象。
如果你犯了一個函數調用.apply()
或.call()
那么你就可以明確控制哪些值this
被設置為與第一個參數.apply()
或.call()
例如: foo.call(obj)
將調用foo()
函數並將this
指針設置為obj
對象。
如果您沒有進行任何函數調用(例如,在全局范圍內),那么this
將是Global對象(瀏覽器中的window
)或在嚴格模式下undefined
。
與上述所有規則一樣, this
取決於調用者如何調用您,而不是如何定義函數/方法。
原因是this
在FOO(),當它被稱為就像是,將引用一個全局對象。 這意味着taco
功能將在全球范圍內引入。
要獲得所需的功能,請使用new foo()
語法。 然后this
將引用一個新對象,將為taco
屬性分配一個新值(函數)。 直接調用taco
會給你一個錯誤。
foo(); // equals window.foo() , `this` equals `window` and `this.taco` equals `window.taco` and `window.taco` equals `taco` as it is global
new foo(); //creates a new object. this will give error because here `this.taco` is not `taco`
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.