如果我在函数中创建回调,我可以获得该回调来访问该函数中的局部变量吗?
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
}
答案 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()
,这是一个谜。