0

したがって、次のようなJavaScriptがある場合:

Foo.init = function(options) {
  Bar.set_listener('some_event', function() {
    console.log(options);
  });
};

ここで、Foo.init({whatever:'hi'})などのオプションを指定してFoo.initを呼び出し、そのBar.set_listenerメソッドがコールバックを受け取って保存し、後で'some_event'がトリガーされたときに呼び出します。 ..。。

console.logは未定義または{whatever:'hi'}を出力しますか?答えは{whatever:'hi'}のようですが、それは私を混乱させます。呼び出されたときのこのコールバックは、Foo.initに渡されたオプション変数を参照する方法をどのように理解していますか?

4

1 に答える 1

2

外部関数で定義された状態を参照する内部関数の機能は、クロージャとして知られています。これは、ラムダまたは関数値を許可するほとんどの言語に存在する機能です。

それがどのように実装されているかは、StackOverflowの回答で実際に言うことができるよりもはるかに長い投稿に値します。しかし、要約すると、Javascriptランタイムは、それらを参照する内部関数が生きている限り、外部関数で定義された値を保持します。

于 2013-03-05T23:17:29.153 に答える