说我想这样做:
function z(){return function(){a = 4}
}
function b(){
var a;
c = z();
c();
}
我想跳过c();
但是我想在调用者范围内返回时立即执行返回的函数,以便我可以使用它。
在这个例子中 a 应该得到值 4。
有办法吗?干杯
说我想这样做:
function z(){return function(){a = 4}
}
function b(){
var a;
c = z();
c();
}
我想跳过c();
但是我想在调用者范围内返回时立即执行返回的函数,以便我可以使用它。
在这个例子中 a 应该得到值 4。
有办法吗?干杯
您应该能够立即执行 return 函数
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
闭包。
试试这个
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();