質問

私は「TestFuncが定義されていません」というエラーを取得していたときにこのコードのビット...

/* my_object.js */
"use strict";
function MyObject (param) {
    this.param = param;
}

MyObject.prototype.TestFunc = function () {
    console.log ('in TestFunc');
}

MyObject.prototype.RealFunc = function () {
    // I have tried 3 different ways to call TestFunc:
    // 1.
    this.TestFunc ();

    // 2.
    TestFunc ();

    // 3. (I didn't really think this would work,
    //     but thought it was worth a try...)
    MyObject.TestFunc ();
}

...このコードのビットから実行されます:

/* index.js */
var myObj = new MyObject ('test');
myObj.RealFunc (); // Firebug: "TestFunc is not defined"
役に立ちましたか?

解決

// 1.
this.TestFunc ();

それは大丈夫です。それは削除他の呼び出しで、動作します。

(まあ、それは限り、あなたはその所有者からRealFuncを剥がすとvar method= myObj.RealFunc; method();のように、イベントハンドラまたはタイムアウトを経由して、自分自身でそれを呼び出すことはありませんように動作します。その場合はRealFuncでthisはないだろうMyObjectにインスタンスとあなたはそれを動作させるために閉鎖またはFunction.bindを見る必要があると思います。)

// 2.
TestFunc ();

いいえ、TestFuncは、ローカルまたはグローバルスコープ内変数として定義されていません。これは、あなたがFirebugのから取得エラーになります。

// 3. (I didn't really think this would work,
//     but thought it was worth a try...)
MyObject.TestFunc ();

いいえ、あなたは正しかったです。それは、MyObject.prototype.TestFunc.call(this)明示的に行われることでしょう:-)ます。

JavaScriptは一種のための標準的なコンストラクタ関数に同じメソッドのいくつかを置くことによって、問題を混同しない内蔵の彼らのプロトタイプ上などのオブジェクト(例えばString.splitはどこ本当に唯一String.prototype.splitがすべき存在します)。あなたが明示的にMyObject.TextFunc= MyObject.prototype.TextFuncのようなものを言うしない限り、しかし、それはあなた自身のオブジェクトに発生しません。

他のヒント

バリアント1が正しいようです。 (私はconsole.logの呼び出しを削除し、alertにそれを変更するが)私はExecuteJSで、あなたのコードを試してみましたが、2と3をスキップし、それが働きました。 TestFuncRealFunc内で呼び出されます。

あなたが"use strict";を削除する場合は

はどうなりますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top