なぜ定義されている関数は、このようなコードは動作しないのですか?他の関数内で呼び出された関数が外部関数の有効範囲にアクセスできないのはなぜですか?
function foo() {
var text = "abc";
bar(); // ReferenceError because bar cannot access foo's local variables
}
function bar() {
console.log(text); // Calling bar inside foo does not grant it access to foo's local variables
}
foo();
我々はテキストという名前のグローバル変数を定義する場合、私は唯一の作業バーを想像することができます。
私はまあ、私は(ES6のブロックを含むJavaScriptのスコープを理解していることを考えるのが好きな私たちは、関数のローカル変数にアクセスすることができる唯一の方法は、この1
function foo() {
var text = "abc";
return function() {
console.log(text);
}
}
bar = foo();
bar();
のようにクロージャを作成経由であろうと理解しますスコーピング)。 私は私の質問は、なぜ他の内部で呼び出された関数は、内部関数として定義されているかのように外部関数のスコープにアクセスできないと思いますか?それの不利な点は何ですか?
これは、宣言されていない変数を使用して関数を記述し、後で周囲の呼び出しコンテキストで書き込む必要があるようです。それは私には(確かに、言語デザイナーではない)議論を引き渡すだけの本当に混乱する選択肢のように思えます。言い換えれば、関数はすでに呼び出しコンテキストからの値を受け入れる方法を持っています:引数。値を供給するための2つの異なる方法(例えば、関数がどの引数を受け入れるかを文書化する必要があると想像することや、呼び出しコンテキストが宣言することを期待するものを想像すること)を混乱させるようです。 – apsillers