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}}
.After
z().apply(obj);
然后
obj.a==4
,还是我遗漏了什么?这可能会起作用。我必须尝试一下。但也许我必须按照既定的方式,将我的obj作为参数传递:(.如果你是(合法的)问问你自己为什么我想要这个疯狂的设置,看看我上面的评论。这将是我解决角度扩展的最佳选择。快速问题——为什么
在z的返回值中返回这个
?@mike:
obj===c
是匿名的
thisVal
function@Bergi:我认为没有必要返回这个或c变量…只是
函数z(){return function(){this.a=4}}
.After
z().apply(obj);
然后
obj.a==4
,还是我遗漏了什么?