2016-08-28 12 views
4

なぜ定義されている関数は、このようなコードは動作しないのですか?他の関数内で呼び出された関数が外部関数の有効範囲にアクセスできないのはなぜですか?

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(); 

のようにクロージャを作成経由であろうと理解しますスコーピング)。 私は私の質問は、なぜ他の内部で呼び出された関数は、内部関数として定義されているかのように外部関数のスコープにアクセスできないと思いますか?それの不利な点は何ですか?

+0

これは、宣言されていない変数を使用して関数を記述し、後で周囲の呼び出しコンテキストで書き込む必要があるようです。それは私には(確かに、言​​語デザイナーではない)議論を引き渡すだけの本当に混乱する選択肢のように思えます。言い換えれば、関数はすでに呼び出しコンテキストからの値を受け入れる方法を持っています:引数。値を供給するための2つの異なる方法(例えば、関数がどの引数を受け入れるかを文書化する必要があると想像することや、呼び出しコンテキストが宣言することを期待するものを想像すること)を混乱させるようです。 – apsillers

答えて

1

どちらも可能です。

「ダイナミックスコープ」とは何ですか。 JavaScriptのやり方は今や「レキシカルスコープ」と呼ばれています。あなたは両方のトピックの話題を得るためにそれらの両方のGoogleをすることができます。

過去に動的スコープを試した言語がありました。しかし、実際には、ダイナミックなスコープでは、プログラムについての理由を突き止め、何が起こっているのか把握するのが難しいと長い間前に判断されました。

レキシカルスコープを使用すると、使用している変数の「バージョン」を調べるだけで、誰があなたに電話をかけているかによって動的スコープが変わることがわかります。それらの変数。

+0

ああ。編集者が自動的に厳格なモードを有効にすることがわかったので、私はJavaScriptで「ダイナミックスコープ」が不可能であったと信じていました。ありがとうございました :-) –

関連する問題