0

私はJavascriptを学んでいて、次のコードをテストしたいと思っています。

var name1 = "global";

function userobject(){
    this.name1 = "local";
}
function func() {
    alert(name1);
}

var myobject=new userobject();
func();
func.call(myobject);

私の理解では、最初にfuncを呼び出すと、alert( "global")が呼び出されますが、2番目の呼び出しであるfunc.call(myobject)では、alert( "local")が呼び出されます。

ただし、実際にはどちらの場合も「グローバル」テキストが表示されます。実行時にインタプリタが変数名を見ると、ローカルでそれを識別しようとし、そこで見つからない場合は親で検索すると思いました。私の場合、func.call(myobject)が原因で、親はmyobjectであり、関数は「ローカル」として定義されているname1変数を使用する必要があると思いました。

私がこのことを理解するのが間違っているところを正しく教えてください。

4

1 に答える 1

2

インタプリタがスコープ内を見つけることができない場合、インタプリタはname1スコープ内でそれを検索し始め、見つからない場合は最終的にグローバル名前空間を検索します。暗黙の参照はないthisのでname1、常にグローバル変数であり、ローカルオブジェクトのプロパティはありません。プロパティに明示的にアクセスした場合、コードは期待どおりに機能します。

function func() {
    alert( this.name1 );
}

あなたのcallメソッドスコープを入れthisますが、ローカル変数が参照するものを変更しません。グローバルオブジェクトプロパティの同じ名前の変数を持つことができますが、それらは同じものにはなりません。

于 2013-03-24T13:00:49.080 に答える