0

我想不出一种方法来解释我在标题中所做的更多的事情,所以我会重复一遍。从对象内调用的匿名函数是否可以访问该对象的范围?下面的代码块应该解释我想要做的比我能做的更好:

function myObj(testFunc) {
    this.testFunc = testFunc;


    this.Foo = function Foo(test) {
        this.test = test;

        this.saySomething = function(text) {
            alert(text);
        };
    };

    var Foo = this.Foo;

    this.testFunc.apply(this);
}

var test = new myObj(function() {
    var test = new Foo();
    test.saySomething("Hello world");
});

当我运行它时,我收到一个错误:“Foo 未定义。” 我如何确保Foo在调用匿名函数时定义它?这是一个用于进一步实验的 jsFiddle 。

编辑:我知道将行添加var Foo = this.Foo;到我传递给我的实例的匿名函数myObj将使这项工作。但是,我想避免在匿名函数中公开变量——我还有其他选择吗?

4

3 回答 3

5

应该是this.Foo

var test = new myObj(function() {
    var test = new this.Foo();
    test.saySomething("Hello world");
});

http://jsfiddle.net/grzUd/5/

或者使用with

var test = new myObj(function() {
    with (this) {
        var test = new Foo();
        test.saySomething("Hello world");
    }
});

http://jsfiddle.net/grzUd/6/

于 2012-07-09T02:27:44.630 回答
2

更改var test = new Foo();var test = new this.Foo();

编辑:或者您可以将其作为参数传递。

function myObj(testFunc) {
    this.testFunc = testFunc;

    var Foo = function (test) {
        this.test = test;
        this.saySomething = function(text) {
            alert(text);
        };
    };

    this.testFunc(Foo);
}

var test = new myObj(function(Foo) {
    var test = new Foo();
    test.saySomething("Hello world");
});
于 2012-07-09T02:28:22.600 回答
1

您似乎对范围链上的标识符解析和属性解析之间的区别感到困惑。

FoomyObj实例的一个属性(即它是一个对象属性)。调用会将Foo解析为作用域链上的变量,这不是查找它的正确位置。这就是为什么 Petah 的答案尝试使用with,将this对象的对象属性放在作用域链上。new Foo

于 2012-07-09T03:13:27.523 回答