在下面的代碼:Javascript:爲什麼具有全局執行上下文的回調函數可以訪問範圍變量?
function test() {
var x = 5 // scoped to test function
console.log(this); // global object
logCb(function(){
console.log(this); // global object
console.log(x);
})
}
function logCb (cb) {
console.log(this); // global object
cb() // This still seems to execute within the test function scope? why...
}
test()
x被作用域進行測試,這是回調函數被定義在哪裏。因爲logCb()函數不能訪問x變量,所以我會預計行cb()
會拋出一個錯誤。
但事實並非如此。爲什麼?看起來回調函數中的引用是在賦值過程中創建的,而不是在執行過程中創建的 - 如果您考慮提升 - 即在編譯過程中,回調函數被提升到「test」的頂部,然後賦值在測試中發生範圍?
我已經讀過,執行與作用域不一樣。在本文中:http://ryanmorr.com/understanding-scope-and-context-in-javascript/,這句話scope pertains to the variable access of a function when it is invoked and is unique to each invocation
似乎暗示回調是從測試函數中調用的。
因爲在我看來,不管在哪裏調用回調函數,它仍然會被測試範圍。
我想我的問題是:
如何在回調函數中定義的條款來處理,然後考慮範圍和執行上下文時調用?
你有沒有聽說過在JavaScript關閉? –
函數的作用域是基於它聲明的地方,而不是從那裏調用的地方。函數的'this'與範圍無關,並且基於* how *函數被調用。 – nnnnnn
@RajaprabhuAravindasamy。所以回調已經結束了測試? –