如果我在一个函数中创建了一个回调函数,我能用这个回调函数来访问这个函数中的局部变量吗?
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
}
5条答案
按热度按时间1cklez4t1#
是的:这正是函数参数的作用,它允许你把一个值从一个作用域传递到另一个作用域。
注意,值被发送到另一个函数,而不是变量,所以你需要返回值并赋值,以便使用它。
klsxnrf12#
如果使用原型,只需设置一个示例属性:
编辑:但是@lonesomeday的答案是一个更好的解决方案,因为它采取了一种更有效的方法来避免副作用:)
x33g5p2x3#
在不知道为什么不想传递参数的情况下,这有点难以解决;如果您只想获得特定函数签名,那么高阶函数可能会有所帮助。
这样你就有了两个函数,一个在另一个里面,外面的一个接受参数,里面的一个可以访问传递给外面的一个的变量。
当然,这只是示例中演示的一半:您可以访问局部变量,但不能修改它。
iq0todco4#
在任何情况下,无论是在OOP上下文中还是其他环境中,都不能从函数外部访问任何函数的内部变量。
唯一的例外是,在函数B中定义的函数A,从函数B返回,可以继续访问函数B中的变量--这是闭包的基本概念。
我不知道你为什么不想使用示例变量,那是它们的作用--在方法之间共享数据,我不知道你为什么不想传入或传出值--那是参数和返回值的作用。
我可以扩展
innerFunc
的作用域来访问x
吗?不,你不能,不管那是什么意思。在JS里没有这样的概念。
最接近你想做的事情就是在构造函数中定义变量:
但是,由于
this.innerFunc
缺少其上下文,因此这将无法按原样工作。然而,为什么要这样做而不是仅仅编写
this.innerFunc()
,这是一个谜。tquggr8v5#
这样做的首选方法是将x赋值给对象的作用域,然后所有函数都可以通过this.x访问它