6

私はvarキーワードに関して非常に奇妙な(私にとって)問題に遭遇しました。私はそれをかなり最小限のテストケースに減らし、Node.js(つまり、V8とChrome)、Safari 4のインスペクター(つまり、Nitro)、およびFireBug(明らかに、SpiderMonkey)に展示されていることを発見しました。私はもともとバグレポートを作成していましたが、非常に広く表示されているため、JavaScriptが変数のスコープと検索をどのように行うのかを完全に誤解していると思います。

テストケースは非常に小さく、GitHubのhttp://gist.github.com/260067にあります。最初の例と2番目の例の唯一の違いは、varキーワードが含まれていることです。

ここでも、同じ「問題」を別の方法で示す同様のテストケースがあります:https ://gist.github.com/698b977ee0de2f0ee54a

編集:カスケードスコープがどのように機能するかを説明しようとするこれ以上の回答を排除するために、私はそれをよく知っています。私の問題は、次のコードが「機能する」理由がわからないことです(つまり、alert()「外部」、「内部」、「外部」の順になります)。

(function(){
  var foo = 'outer';
  alert("Outer `foo`: " + foo);

  (function(){
    foo = 'inner';
    alert("Inner `foo`: " + foo);

    var foo;
  })();

  alert("Outer `foo`: " + foo);
})();

;のvar foo;再割り当てとはまったく関係のない位置で発生します。fooでは、なぜそれがその割り当てに非常に大きな影響を与えるのでしょうか。

4

3 に答える 3

14

問題は、他の言語とは異なり、JavaScript は関数の開始時にすべての変数を作成することです。これは、コードが次のことを意味します。

(function(){
    if(myVar == undefined){
        alert(myVar);
    }
    if(myVar == undefined){
        var myVar = 5;
    }
})();

実際にコンパイルされ、次のように解釈されます

(function(){
    var myVar;
    if(myVar == undefined){
        alert(myVar);
    }
    if(myVar == undefined){
        myVar = 5;
    }
})();

変数を作成し、if または loop ブロック内でのみ使用できるようにするletには、新しい JavaScript 機能である を使用する必要があります。まだ実装しているブラウザーの数はわかりません (Firefox 3.5 を使用している場合<script type="text/javascript;version=1.7">)。

(function(){
    if(myVar == undefined){
        alert(myVar);
    }
    if(myVar == undefined){
        let myVar = 5;
    }
})();
于 2009-12-19T13:44:50.397 に答える
2

var exports多くの言語では、ローカル変数とまったく同じようには機能しません。exports囲んでいるブロックだけでなく、関数全体でローカル変数として宣言するため (最初の使用後に表示されますが)、同じ名前の関数引数は非表示になります。

編集:letキーワードはより慣習的に機能します (包含ブロックに対してのみ変数を宣言します) が、JavaScript のすべてのバージョンで使用できるわけではありません。

于 2009-12-19T13:32:36.563 に答える
1

var を含めることは、{} の割り当てがグローバル変数 exports ではなくローカル変数 exports に対して行われることを意味します。つまり、効果がないことを意味します。

于 2009-12-19T13:30:51.113 に答える