从对象内调用的函数是否可以访问该对象的作用域?

时间:2012-07-09 02:25:19

标签: javascript

我想不出一种解释我所追求的东西的方法,而不是我在标题中所做的,所以我会重复一遍。从对象内调用的匿名函数是否可以访问该对象的范围?以下代码块应该解释我正在尝试做的比我更好:

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未定义。”当我调用匿名函数时,如何确保定义FooHere's a jsFiddle进一步试验。

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

3 个答案:

答案 0 :(得分: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/

答案 1 :(得分: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");
});

答案 2 :(得分:1)

您似乎对作用域链上的标识符解析与属性解析之间的区别感到困惑。

Foo myObj 实例的属性(即它是对象属性)。调用new Foo会将 Foo 解析为作用域链上的变量,这不是寻找它的正确位置。这就是为什么Petah的回答试图将一起使用,将这个对象的对象属性放在范围链上。