javascript 访问回调内函数的局部变量

xytpbqjk  于 2023-03-06  发布在  Java
关注(0)|答案(5)|浏览(188)

如果我在一个函数中创建了一个回调函数,我能用这个回调函数来访问这个函数中的局部变量吗?

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
}
1cklez4t

1cklez4t1#

是的:这正是函数参数的作用,它允许你把一个值从一个作用域传递到另一个作用域。

Obj.prototype.outerFunc = function() 
{
    var x = 0;
    var callback = this.innerFunc;
    x = callback(x);
}

Obj.prototype.innerFunc = function(x)
{
    x++;
    return x;
}

注意,值被发送到另一个函数,而不是变量,所以你需要返回值并赋值,以便使用它。

klsxnrf1

klsxnrf12#

如果使用原型,只需设置一个示例属性:

// 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的答案是一个更好的解决方案,因为它采取了一种更有效的方法来避免副作用:)

x33g5p2x

x33g5p2x3#

在不知道为什么不想传递参数的情况下,这有点难以解决;如果您只想获得特定函数签名,那么高阶函数可能会有所帮助。

Obj.prototype.outerFunc = function() 
{
    var x = 0;
    var callback = this.innerFunc(x);
    callback();
}

Obj.prototype.innerFunc = function(x)
{
    return function () { /* use x in here */ };
}

这样你就有了两个函数,一个在另一个里面,外面的一个接受参数,里面的一个可以访问传递给外面的一个的变量。
当然,这只是示例中演示的一半:您可以访问局部变量,但不能修改它。

iq0todco

iq0todco4#

在任何情况下,无论是在OOP上下文中还是其他环境中,都不能从函数外部访问任何函数的内部变量。
唯一的例外是,在函数B中定义的函数A,从函数B返回,可以继续访问函数B中的变量--这是闭包的基本概念。
我不知道你为什么不想使用示例变量,那是它们的作用--在方法之间共享数据,我不知道你为什么不想传入或传出值--那是参数和返回值的作用。
我可以扩展innerFunc的作用域来访问x吗?
不,你不能,不管那是什么意思。在JS里没有这样的概念。
最接近你想做的事情就是在构造函数中定义变量:

function Obj() {
  var x = 0;

  this.outerFunc = function() {
    var callback = this.innerFunc;
    callback();
  };

  this.innerFunc = function() {
    x++;
  }
}

但是,由于this.innerFunc缺少其上下文,因此这将无法按原样工作。

var callback = () => this.innerFunc();

然而,为什么要这样做而不是仅仅编写this.innerFunc(),这是一个谜。

tquggr8v

tquggr8v5#

这样做的首选方法是将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;
}

相关问题