3

私は JavaScript を学んでおり、jQuery の Web サイトでこのチュートリアルを進めています。

次の例では

    // A function being attached to an object at runtime
    var myName = "the global object";
    var sayHello = function ()
    {
        console.log("Hi! My name is " + this.myName);
    };
    var myObject = {
        myName: "Rebecca"
    };
    var secondObject = {
        myName: "Colin"
    };

    myObject.sayHello = sayHello;
    secondObject.sayHello = sayHello;

    sayHello();              // "Hi! My name is the global object"
    myObject.sayHello();     // "Hi! My name is Rebecca"
    secondObject.sayHello(); // "Hi! My name is Colin"

sayHello()が呼び出されたときに期待される出力が表示されません。代わりに変数はundefined. しかし、グローバル変数を割り当てて定義するとwindow.myName、機能します。

Chrome バージョン 25.0.1364.152 m を使用しています。

チュートリアルが間違っているか、何か不足していますか?

完全な HTML はこちら: http://pastebin.com/4M27vDB4

更新:受け入れられた回答は、何が起こったのかを説明しています。また、可能な解決策についても言及したいと思います-上記のグローバル変数を宣言せずに宣言しますvar。次の理由により:

さらに、var キーワードなしで関数内で宣言された変数は、関数に対してローカルではありません — JavaScript は、変数が以前に定義された場所を見つけるために、ウィンドウ スコープまでずっとスコープ チェーンをトラバースします。変数が以前に定義されていない場合は、グローバル スコープで定義されるため、予期しない結果が生じる可能性があります。

4

2 に答える 2

4

このコードを中に入れました

$(document).ready(function ()
    // ...
}); 

閉鎖。この場合、内部のコンテキストはそうではなくwindowdocumentオブジェクトになります)、undefined説明したとおりになります。

于 2013-03-08T07:07:29.870 に答える
3

プログラムで使用しthis.myNameた . thisキーワードは、現在のオブジェクトを指すために使用されます。その場合にのみ呼び出すsayHello()場合、デフォルトの現在のオブジェクトはウィンドウであるため、「this」は「ウィンドウ」を意味します。定義していない場合window.myName、「未定義」となります。

于 2013-03-08T07:11:22.583 に答える