1

说我想这样做:

function z(){return function(){a = 4}
}

function b(){
 var a;
 c = z();
 c();
}

我想跳过c();但是我想在调用者范围内返回时立即执行返回的函数,以便我可以使用它。

在这个例子中 a 应该得到值 4

有办法吗?干杯

4

4 回答 4

8

您应该能够立即执行 return 函数

z()();
于 2013-01-07T17:46:28.613 回答
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闭包。

于 2013-01-07T20:34:05.937 回答
1

试试这个

function z(){
    return function(){ 
        return 4;
    }
}

function b(){
    var a;
    a = z()();
}
于 2013-01-07T17:48:25.537 回答
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();
于 2013-01-07T18:01:05.370 回答