2

これは一種のばかげた例ですが、なぜこのコードでバーが定義されていないというエラーが発生するのでしょうか。javascriptは、barが「this」オブジェクトのプロパティであるかどうかを確認しません。これを追加すると問題が解決することはわかっていますが、これは私を失望させる傾向があります。たとえば、他のプログラミング言語(C#)では、これは通常冗長です。なぜ、以下のコードに追加する必要があるのでしょうか。

   var myObject = {
        foo : function(){
            alert(bar);
        },
        bar : "hello world"
    };

    myObject.foo();

http://jsfiddle.net/Mv86n/

4

7 に答える 7

1

なぜなら、あなたが示したように、JavaScriptは変数ルックアップを。で開始しないthisからです。

于 2012-11-19T20:43:38.510 に答える
1

javascriptは、barが「this」オブジェクトのプロパティであるかどうかを確認しません

いいえ。現在のコンテキストのメンバーであるプロパティではなく、スコープ内にある変数を調べます。

于 2012-11-19T20:44:09.693 に答える
1

Javascriptには、オブジェクトスコープではなく、関数スコープがあります。

同じ関数内で宣言された識別子のみがローカルスコープにあり、他のすべてはグローバルスコープからアクセスされます。

于 2012-11-19T21:03:45.257 に答える
1

それはそのようには機能しません。可能性はありますが、言語設計者はおそらく、その方法では非効率性、あいまいさ、コードが発生し、何が起こっているのかを理解するのが難しいと考えていました。

「これ」を前に付ける必要性に悩まされることもあることを認めます。物事に、そして私が常に「var self = this;」と言わなければならないことにさらにいらいらしますが、それはJavascriptでの生活です。あなたはそれが何であるかを受け入れて、先に進む必要があります。

于 2012-11-19T21:15:15.360 に答える
0

このように考えてください:

var myObject = {
    foo : null,
    bar : "hello world"
};
myObject.foo = function(){
    alert(bar);
}

さて、何barを参照することになっていますか?あなたが今より簡単に見ることができるようにbar、範囲内ではありません。

C#では、メソッドはオブジェクトに属し、それらがどの属性を持っているかがわかっているため、そのようなことが可能です。しかし、JavaScriptでは、その知識がなく、「メソッド」は属しておらず、属性は動的であるため、このようなスコープルールは実行不可能です。

于 2012-11-19T20:50:18.693 に答える
0

javascriptでは、ルックアップの優先順位は、実行されるコードの最も近いものから最も遠いものまでの祖先関数スコープ(C ++やJavaとは異なり、ネストすることができます)です。

その些細な例では、暗黙的なものを持つことはthis理にかなっているように見えますが、ネストされた関数やオブジェクトのさまざまなレベルで指定して使用する方がはるかに複雑です。

(function() {
    var myVar = "dsjsh";
    return {
        myVar: "var",
        myMethod: function() {
            /* which */ myVar;
        };
    }
})()

明らかに、言語は単純さの選択をしました(少なくともこの問題に関しては)。

于 2012-11-19T20:51:44.643 に答える
0

JavaScriptには、クラスクラススコープの概念が正確に含まれているわけではありません。myObjectオブジェクトではなく、マップとして考える必要があります。たとえば、次のようにすることができます。

function foo() {
    alert(this.bar);
}
var myObject = {
    bar: "hello world"
};
myObject.foo = foo;

この場合、なぜそれがいつ定義されるかをfoo知る必要がありますか?myObjectを呼び出すとmyObject.foo()、JavaScriptは次のように渡さmyObjectthis(もちろん、これに関するJavaScriptのスコープ規則は奇妙なものであるため、this必ずしもあなたが思っているものとは限りません)、からアクセスできmyObjectますthis。と呼んだだけfoo()では、this何か違うものになり(ブラウザではおそらくそうなるでしょうwindow)、アクセスすら機能しthis.barません。

于 2012-11-19T20:52:51.167 に答える