: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()
行にエラーがスローされると思います。
ただし、これは該当しません。どうして?コールバック内の参照は、割り当て中に作成され、実行中ではないようです - 巻き上げを検討すると、つまりコンパイル時にコールバック関数が 'テスト'の先頭に持ち上げられ、テスト内で割り当てが行われる範囲?
私は実行がスコープと同じではないことを読んでいます。この記事の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'はスコープと無関係で、関数の呼び出し方法*に基づいています。 – nnnnnn
@RajaprabhuAravindasamy。だから、コールバックはテストオーバークロージャを持っていますか? –