我想不出一种解释我所追求的东西的方法,而不是我在标题中所做的,所以我会重复一遍。从对象内调用的匿名函数是否可以访问该对象的范围?以下代码块应该解释我正在尝试做的比我更好:
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
? Here's a jsFiddle进一步试验。
修改:我知道将var Foo = this.Foo;
行添加到我传递给myObj
实例的匿名函数中会使这项工作正常进行。但是,我想避免在匿名函数中公开变量 - 我还有其他选择吗?。
答案 0 :(得分:5)
应为this.Foo
:
var test = new myObj(function() {
var test = new this.Foo();
test.saySomething("Hello world");
});
或者使用with
:
var test = new myObj(function() {
with (this) {
var test = new Foo();
test.saySomething("Hello world");
}
});
答案 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的回答试图将与一起使用,将这个对象的对象属性放在范围链上。