[英]Access local variable of function inside callback
如果在函数中创建回调,是否可以获取该回调以访问该函数中的局部变量?
Obj.prototype.outerFunc = function()
{
var x = 0;
var callback = this.innerFunc;
callback();
}
Obj.prototype.innerFunc = function()
{
x++;
}
x
自然不属于innerFunc
的范围,并且如果被自身调用将产生错误。 但是,如果我把它从outerFunc
可我延长innerFunc's
以访问范围x
?
编辑:应该提到我不想将参数传递给函数或使x和Obj的实例。 我更希望把innerFunc
,就像它在当地宣布outerFunc
。 类似于以下内容:
Obj.prototype.outerFunc = function()
{
var x = 0;
var callback = function() {
x++;
}
callback(); // works
}
是的:这正是功能参数的用途。 它们允许您将值从一个范围传递到另一个范围。
Obj.prototype.outerFunc = function()
{
var x = 0;
var callback = this.innerFunc;
x = callback(x);
}
Obj.prototype.innerFunc = function(x)
{
x++;
return x;
}
请注意,该值将发送到其他函数,而不是变量。 因此,您需要返回值并分配它才能使用它。
如果您使用的是原型,则只需设置一个实例属性:
// constructor
var Obj = function () {}
Obj.prototype.outerFunc = function()
{
this.x = 0;
var callback = this.innerFunc.bind(this);
callback();
}
Obj.prototype.innerFunc = function()
{
this.x++;
}
var instance = new Obj()
instance.outerFunc()
console.log(instance.x) // returns 1
编辑:但是@lonesomeday的答案是一个更好的解决方案,因为它采用了一种功能更强的方法来避免副作用:)
首选的方法是将x分配给对象的范围,然后所有函数都可以通过this.x访问它
Obj.prototype.outerFunc = function()
{
this.x= 0; // set x to zero
this.innerFunc();
}
Obj.prototype.innerFunc = function(x)
{
this.x++;
return this.x;
}
不知道为什么不希望传递参数,这很难解决。 如果您只想拥有特定的功能签名,也许高阶功能可能会有所帮助?
Obj.prototype.outerFunc = function()
{
var x = 0;
var callback = this.innerFunc(x);
callback();
}
Obj.prototype.innerFunc = function(x)
{
return function () { /* use x in here */ };
}
这样,您就可以在内部拥有两个功能。 外部的一个接受参数,内部的一个可以访问传递给外部的变量。
当然,这仅能为您提供示例所展示内容的一半:您可以访问局部变量,但不能对其进行修改。
在任何情况下,无论是在OOP上下文中还是在其他情况下,您都无法从函数外部访问任何函数的内部变量。
唯一的例外是,在函数B中定义并从该函数B返回的函数A继续可以访问函数B中的变量-基本的闭包概念。
我不知道为什么你不想使用实例变量。 这就是他们的目的-跨方法共享数据。 我不知道您为什么不希望传入或传出值,这就是参数和返回值的用途。
我可以扩展
innerFunc
的范围来访问x
吗?
不,您不能,这意味着什么。 JS中没有这样的概念。
您似乎最想做的是在构造函数中定义变量:
function Obj() {
var x = 0;
this.outerFunc = function() {
var callback = this.innerFunc;
callback();
};
this.innerFunc = function() {
x++;
}
}
但是,这不能按this.innerFunc
工作,因为this.innerFunc
缺少上下文。 因此,您需要编写
var callback = () => this.innerFunc();
但是,为什么要执行此操作而不是仅仅编写this.innerFunc()
仍然是一个谜。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.