0

JS コンストラクターのコンテキストで何が問題なのか混乱しています。ctor 内で、関数が宣言されています。その関数への呼び出しがthisctor のコンテキストに設定される前。関数内で の値thisが に設定されwindowます。理由がわかりません。HTML では、ctor は「new」で呼び出されます。

function MyCtor() {
    var myFunc = function() {
         debugger; // #2
         // code for myFunc
     }

     debugger;  // #1
     myFunc();
     debugger;  // #3
}

デバッガ #1 では、thisに設定されていMyCtorます。#2thiswindowです。そして #3 で に戻りMyCtorます。

ここで何か基本的なことが欠けていると確信していますが、スコープとコンテキストについて多くのことを読みました。明らかに十分ではありません。

4

1 に答える 1

2

thisオブジェクトは、Javascript で最も厄介で理解しにくい概念の 1 つです。そして、それは勝つためのかなりのコンテストです...最初に、呼び出す関数ごとに固有であることを理解する必要があります.myFuncを呼び出すコンテキストは、あなたが望むように設定されません. これを行う方法の 1 つを次に示します。

function MyCtor() {
    this.myFunc = function() {
         debugger; // #2
         // code for myFunc
     }

     debugger;  // #1
     this.myFunc();
     debugger;  // #3
}

this一般に、関数が特定の値であることを信頼できる状況はごくわずかです。私の知る限り、それらのすべて:

objectToBeThis.aFunction = function() { ... } // declare this function as
// an object property at any time - 
objectToBeThis.aFunction();

または、あまり使用されない:

aFunction.call(objectToBeThis, extraArgument1, extraArgument2);

名前付きではあるが「所有されている」関数 (つまり 、var functionName = function()またはfunction functionName()) が呼び出されると、windowそのthis引数として があります。この部分は確実ではありませんが、thisそのようなメソッド内では使用しません。

コードの場合と同様に、「new MyCtor」もあります。これは、返される新しいオブジェクトが作成され、そのオブジェクトがthisコンストラクター メソッドの内部に設定されます。

于 2013-10-10T21:38:12.437 に答える