在回调中访问函数的局部变量

时间:2017-03-25 15:23:03

标签: javascript scope callback

如果我在函数中创建回调,我可以获得该回调来访问该函数中的局部变量吗?

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

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

x自然不在innerFunc的范围内,如果自己调用会产生错误。但是,如果我从outerFunc调用它,我是否可以扩展innerFunc's范围以访问x

编辑:应该提到我不想将参数传递给函数或者生成Ob和Ob的实例。我更希望将innerFunc视为在outerFunc本地声明。类似于下面可以做的:

Obj.prototype.outerFunc = function()
{
    var x = 0;
    var callback = function() {
        x++;
    }
    callback(); // works
}

5 个答案:

答案 0 :(得分:2)

是:这正是函数参数的用途。它们允许您将值从一个范围传递到另一个范围。

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

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

请注意,该值将发送到其他函数,而不是变量。所以你需要返回值并分配它以便使用它。

答案 1 :(得分:0)

如果你正在使用原型,只需设置一个实例属性:

// 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的答案是一个更好的解决方案,因为它需要更多功能性方法来避免副作用:)

答案 2 :(得分:0)

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

答案 3 :(得分:0)

如果不知道为什么不想传递参数,这有点难以解决;如果你只想拥有一个特定的函数签名,那么高阶函数可能有帮助吗?

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

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

这样你就可以在另一个里面有两个功能。外部参数采用参数,内部参数可以访问传递给外部参数的变量。

这当然只能为您提供示例中示例的一半:您可以访问本地变量但不能修改它。

答案 4 :(得分:0)

在任何情况下,在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缺少其上下文。因此,您需要编写

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

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