Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 访问回调函数中的局部变量_Javascript_Scope_Callback - Fatal编程技术网

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

Javascript 访问回调函数中的局部变量,javascript,scope,callback,Javascript,Scope,Callback,如果我在一个函数中创建了一个回调函数,我可以让该回调函数访问该函数中的局部变量吗 Obj.prototype.outerFunc = function() { var x = 0; var callback = this.innerFunc; callback(); } Obj.prototype.innerFunc = function() { x++; } x自然不在innerFunc的范围内,如果自己调用,将产生错误。但是如果我从outerFunc调用

如果我在一个函数中创建了一个回调函数,我可以让该回调函数访问该函数中的局部变量吗

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

Obj.prototype.innerFunc = function()
{
    x++;
}
x
自然不在
innerFunc
的范围内,如果自己调用,将产生错误。但是如果我从
outerFunc
调用它,我是否可以扩展
innerFunc的
范围以访问
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;
}

请注意,值被发送到另一个函数,而不是变量。因此,您需要返回值并分配它才能使用它。

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

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

如果您使用的是原型,只需设置一个实例属性:

// 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分配给对象的作用域,然后所有函数都可以通过这个.x访问它

Obj.prototype.outerFunc = function() 
{
    this.x= 0; // set x to zero
    this.innerFunc();

}

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

执行此操作的首选方法是将x指定给对象的作用域,然后所有函数都可以通过此.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 */ };
}
这样就有了两个函数,一个在另一个内部。外部的接受参数,内部的可以访问传递给外部的变量


当然,这只提供了您在示例中演示的内容的一半:您可以访问局部变量,但不能修改它。

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

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
缺少其上下文,因此无法正常工作。因此,您需要编写

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

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

在任何情况下,在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()

本应提到的,但我试图避免将x作为参数传入(请参阅我对原始问题所做的编辑)@sookie这正是函数应该避免的。我应该提到,但我试图避免将x作为参数传入(请参阅我对原始问题所做的编辑)@sookie这正是函数应该避免的。谢谢。我实际上是在试图避免将x作为Obj的实例(请参见我对原始问题所做的编辑),如果您可以在outerFunc中添加原型,那么x将是可访问的,或者如果您可以将x作为对象外部的全局对象。谢谢。我实际上是在试图避免将x作为Obj的实例(请参见我对原始问题所做的编辑),如果您可以在outerFunc中添加原型,那么x将是可访问的,或者如果您可以将x作为对象外部的全局对象。对不起,我应该提到,但我实际上是在试图避免将x作为Obj的实例(请参见我对原始问题所做的编辑)索尔