这可能是一个基本问题,我知道这里有一些类似的问题,但我仍然没有找到答案。请考虑以下代码:
function Outer(inner2) {
var x = 5;
this.inner1 = function() {return (x);}
this.inner2 = inner2.bind(this);
}
var outer = new Outer(function() {return (x);});
alert(outer.inner1()); // works
alert(outer.inner2()); // does not work
如果我要用this.x = 5;
替换第二行,第二个警报就可以了。所以我想问题是x
与var
一起声明时不属于this
,因此bind
无效。
有没有办法在不使用this.x
的情况下完成这项工作?
答案 0 :(得分:1)
顺便说一句,你可能甚至不需要使用有没有办法在不使用
this.x
的情况下完成这项工作?
bind
,当构造函数和方法都使用inner2
时,只需调用this.x
作为对象的方法就足够了。
如果您不想让x
成为对象的属性,但将其保留为局部变量,通常的策略是将其作为参数传递给回调,而不是尝试以某种方式隐含地使其在其范围内可用:
function Outer(callback) {
var x = 5;
this.inner1 = function() { return x; };
this.inner2 = function() { return callback(x); };
// ^^^
}
var outer = new Outer(function(y) { return y; });
// ^ ^
alert(outer.inner1()); // works
alert(outer.inner2()); // works
答案 1 :(得分:1)
我认为你需要澄清这个词是什么"这个"指的是。
"这"是不指向函数"外部。"
使用" new"调用构造函数时关键字,发生了一些事情。
因此,您将回调函数绑定到要返回的对象来自构造函数,不构造函数本身。
因此,回调函数绑定到外部(使用小写),而不是外部(使用大写)。
此外,绑定时,您没有绑定到函数的范围。 X未分配给任何属性。我认为你只能绑定到一个对象并使用this.a等访问它的属性。
第一个函数中的x有效,因为它的值是在函数范围内赋值的。
答案 2 :(得分:0)
我发现了一个虽然难看的解决方案:
function Outer(inner2) {
var x = 5;
this.inner1 = function() {return (x);}
eval('this.inner2 = ' + inner2.toString());
}
这有效并且显示了我的观点:参数inner2
只是this.inner2
应该是什么样子的处方;它永远不会被自己调用。
请告诉我,如果你有一个比这更简洁的解决方案。