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的实例(请参见我对原始问题所做的编辑)索尔