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() {
        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 に答える
1

これを試して

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

function b(){
    var a;
    a = z()();
}
于 2013-01-07T17:48:25.537 に答える