次のコードでは:
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 は test にスコープされており、ここでコールバック関数が定義されています。cb()
logCb() 関数は x 変数にアクセスできないため、行にエラーがスローされると予想していました。
しかし、そうではありません。なんで?コールバック内の参照は割り当て中に作成され、実行中には作成されないようです-巻き上げを検討する場合、これは理にかなっていると思います-つまり、コンパイル中に、コールバック関数が「テスト」の先頭に巻き上げられ、テストの中で割り当てが発生します範囲?
実行はスコープと同じではないことを読みました。この記事: 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
はコールバックがテスト関数内から呼び出されることを暗示しているようです。
コールバック関数が呼び出された場所に関係なく、テストのスコープが設定されているように思われるためです。
私の質問は次のとおりです。
スコープと実行コンテキストを考えるとき、コールバック関数は定義と呼び出しの観点からどのように処理されますか?