0

そこで、JavaScript レキシカルスコープに関するこの記事を読んでいるのですが、著者は「JavaScript は真に静的ではない」と指摘しています。次に、彼は次の例でこれを「証明」します。

var count = 5;

function tellCount() {
    console.log(count);
};
tellCount(); //prints 5
count = 7;
tellCount(); //prints 7;

ここで何が欠けていますか?彼はカウント変数をグローバル名前空間に 5 として配置し、グローバル変数を参照して 5 を出力するメソッドを呼び出し、グローバル変数を 7 に変更してメソッドを再度呼び出します。私が間違っていなければ、グローバル変数を変更し、変数を使用するメソッドを再呼び出しすると、静的にスコープされた言語でこれが行われます。

著者は、JavaScript が真に静的スコープではないことを本当に証明していますか?

注: JavaScript の eval が動的スコープの形式を JS に導入することは知っていますが、この著者が書いたことを証明/反証することにもっと興味があります。

4

2 に答える 2

1

あなたは何も見逃しておらず、作者は間違っています。レキシカル スコープとは、クロージャーが定義されている関数内の変数にアクセスできることを意味し、クロージャーが定義されたときに魔法のようにコピーされることを意味しません。

于 2013-02-21T05:51:08.587 に答える
0

これは悪い例だと思います。記事の次の例は、より効果的な参照メカニズムを示しています。

var numbers = [1, 2, 3, 4, 5];
for (var i in numbers) {
    var num = numbers[i];
    var anchor = document.createElement('A');
    anchor.setAttribute('href', '#');
    anchor.appendChild(document.createTextNode(num));
    document.body.appendChild(anchor);

    anchor.addEventListener('click', function(event) {
        alert('My number is ' + num);
        event.preventDefault();
    }, false);
}
于 2013-02-21T05:41:42.740 に答える