Javascript 返回自执行函数
说我想这样做:Javascript 返回自执行函数,javascript,Javascript,说我想这样做: function z(){return function(){a = 4} } function b(){ var a; c = z(); c(); } 我想跳过c()但我希望在调用方范围内返回时立即执行返回的函数,以便使用它 在本例中,a应获得值4 有办法吗? 干杯您应该能够使用 z()(); 您应该能够使用 z()(); 试试这个 function z(){ return function(){ return 4; } } f
function z(){return function(){a = 4}
}
function b(){
var a;
c = z();
c();
}
我想跳过c()
但我希望在调用方范围内返回时立即执行返回的函数,以便使用它
在本例中,a应获得值4
有办法吗?
干杯您应该能够使用
z()();
您应该能够使用
z()();
试试这个
function z(){
return function(){
return 4;
}
}
function b(){
var a;
a = z()();
}
试试这个
function z(){
return function(){
return 4;
}
}
function b(){
var a;
a = z()();
}
看起来很奇怪,但你想这样做吗
function z(){
return function() {
this.a = 4;
return this;
}
}
function b(){
var obj = { a : 0 };
var c = z().apply(obj);
console.log(c.a);
}
b();
看起来很奇怪,但你想这样做吗
function z(){
return function() {
this.a = 4;
return this;
}
}
function b(){
var obj = { a : 0 };
var c = z().apply(obj);
console.log(c.a);
}
b();
不,这是不可能的(如果不使用像eval
这样的技巧)。无法更改z
返回的函数的范围
如果没有闭包,您的示例可能会更简单,您所要求的只是
function c() {
a = 4;
}
function b() {
var a;
c(); // should change variable a
return a;
}
b(); // is expected to return 4, but does not
您不能改变函数的作用域,也不能传递作用域对象(比如指向变量的指针)。但是,您可以传递其属性将被函数更改的对象:
function z(obj) {
return function() {
obj.a = 4;
};
}
function b() {
var o = {};
z(o)(); // as mike and others said, this is the same as yours
// - you don't need the c variable
return o.a;
}
b(); // returns 4 now
escaparello也做了类似的事情,只是他使用了对象作为thisValue
,并将其传递给匿名函数,而不是z
。我认为我的方法更容易理解,并且更好地使用了z
闭包。不,这是不可能的(如果不使用eval
之类的技巧)。无法更改z
返回的函数的范围
如果没有闭包,您的示例可能会更简单,您所要求的只是
function c() {
a = 4;
}
function b() {
var a;
c(); // should change variable a
return a;
}
b(); // is expected to return 4, but does not
您不能改变函数的作用域,也不能传递作用域对象(比如指向变量的指针)。但是,您可以传递其属性将被函数更改的对象:
function z(obj) {
return function() {
obj.a = 4;
};
}
function b() {
var o = {};
z(o)(); // as mike and others said, this is the same as yours
// - you don't need the c variable
return o.a;
}
b(); // returns 4 now
escaparello也做了类似的事情,只是他使用了对象作为
thisValue
,并将其传递给匿名函数,而不是z
。我认为我的方法更容易理解,并且更好地利用了z
闭包。b()
抛出了一个错误“'a'不是函数”
”你到底是什么意思?应该改变什么范围?顺便说一句,您不需要c
变量,只需执行a()()
。a应更改为4。该函数应该在b()的范围内执行,而在我使用z()时它不会执行。在问之前已经试过了;)谢谢你的编辑,现在你的问题很清楚了。请注意,您的问题实际上与闭包无关,并且您的任何地方都没有自动执行的函数。b()
抛出一个错误“'a'不是函数”
”您的确切意思是什么?应该改变什么范围?顺便说一句,您不需要c
变量,只需执行a()()
。a应更改为4。该函数应该在b()的范围内执行,而在我使用z()时它不会执行。在问之前已经试过了;)谢谢你的编辑,现在你的问题很清楚了。请注意,您的问题实际上与闭包无关,并且您在任何地方都没有自执行函数。我想在返回的函数中访问调用方作用域的var。通常,您只需将其从调用者范围传递到被调用者范围,但我想知道是否还有其他方法。@Heinrich范围由定义函数的词法上下文确定。你不能“重新定位”一个函数,所以你在这里的评论中提出的问题在JavaScript中是不可能的。谢谢。不过听到这个消息很难过。我想扩展angular HTTP请求,使其能够在客户端JS数据库中缓存请求。所以一个变量可能有两个值。我的想法是返回一个自调用函数,首先将var设置为缓存的值,然后在更新数据库中的相应值时从后端将其更改为值。到目前为止,这是我最好的选择:我希望在返回的函数中访问调用方作用域的var。通常,您只需将其从调用者范围传递到被调用者范围,但我想知道是否还有其他方法。@Heinrich范围由定义函数的词法上下文确定。你不能“重新定位”一个函数,所以你在这里的评论中提出的问题在JavaScript中是不可能的。谢谢。不过听到这个消息很难过。我想扩展angular HTTP请求,使其能够在客户端JS数据库中缓存请求。所以一个变量可能有两个值。我的想法是返回一个自调用函数,首先将var设置为缓存的值,然后在更新数据库中的相应值时从后端将其更改为值。那将是我迄今为止最好的选择:那可能奏效。我得试试。但也许我必须按照既定的方式通过我的obj作为参数:(.如果你是(合法的)问问你自己为什么我想要这个疯狂的设置,看看我上面的评论。这将是我解决角度扩展的最佳选择。快速问题——为什么在z的返回值中返回这个
?@mike:obj===c
是匿名的thisVal
function@Bergi:我认为没有必要返回这个或c变量…只是function z(){return function(){this.a=4}}
.Afterz().apply(obj);
然后obj.a==4
,还是我遗漏了什么?这可能会起作用。我必须尝试一下。但也许我必须按照既定的方式,将我的obj作为参数传递:(.如果你是(合法的)问问你自己为什么我想要这个疯狂的设置,看看我上面的评论。这将是我解决角度扩展的最佳选择。快速问题——为什么在z的返回值中返回这个
?@mike:obj===c
是匿名的thisVal
function@Bergi:我认为没有必要返回这个或c变量…只是函数z(){return function(){this.a=4}}
.Afterz().apply(obj);
然后obj.a==4
,还是我遗漏了什么?