说我想这样做:
function z(){return function(){a = 4}
}
function b(){
var a;
c = z();
c();
}
我想跳过c();
但是我希望在调用者范围内返回后立即执行返回的函数,以便我可以使用它。
在此示例中,a应获取值4 。
有办法吗? 欢呼声
答案 0 :(得分:7)
您应该可以使用
立即执行返回功能z()();
答案 1 :(得分:3)
不,这是不可能的(不使用像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
闭包。
答案 2 :(得分:1)
试试这个
function z(){
return function(){
return 4;
}
}
function b(){
var a;
a = z()();
}
答案 3 :(得分:1)
看起来很奇怪,但你想做这样的事情吗?
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();