4

当这段代码时,我收到“TestFunc is not defined”错误...

/* 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"
4

2 回答 2

3
// 1.
this.TestFunc ();

没关系。删除其他呼叫后,这将起作用。

(好吧,只要您不RealFunc从其所有者那里剥离并自行调用它,例如var method= myObj.RealFunc; method();或通过事件处理程序或超时,它就可以工作。在这种情况下this,RealFunc 不会是 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.

于 2010-02-05T14:55:57.480 回答
1

变体 1 似乎是正确的。我在 ExecuteJS 中尝试了您的代码并跳过了 2. 和 3.,它有效(尽管我删除了对 的调用console.log并将其更改为alert)。TestFunc内调用RealFunc

如果删除会发生什么"use strict";

于 2010-02-05T14:56:21.733 回答