2013-01-07 129 views
1

說我要做到這一點:返回自執行功能

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

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

我想跳過c();而是我想在在主叫範圍返回立刻執行返回的功能,這樣我就可以用它工作。

在這個例子中a應該得到值4

有沒有辦法? 歡呼

+1

'b()'拋出一個錯誤「''a'不是一個函數'」 – Bergi

+0

對不起太倉促了。 – Heinrich

+0

你究竟是什麼意思?什麼範圍應該改變?順便說一句,你不需要'c'變量,你可以做'a()()'。 – Bergi

回答

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 。我認爲我更容易理解,並更好地使用了關閉。

7

你應該能夠與

z()(); 
+0

我想在返回的函數中訪問調用者作用域的var。通常你只是將它從調用者範圍傳遞給被調用者範圍,但我想知道是否有其他方法。 – Heinrich

+0

@ Heinrich作用域由函數定義的詞法上下文決定。你不能「重新定位」一個函數,所以你在這裏發表的問題在JavaScript中是不可能的。 – Pointy

+0

謝謝。很遺憾聽到它。我想擴展角度HTTP請求,並有可能在客戶端JS數據庫中緩存請求。因此,一個變量會有2個可能的值。我的想法是返回自調用函數,首先將var設置爲緩存值,然後將其更改爲來自後端的值,同時更新數據庫中的相應值。那將是我迄今爲止最好的選擇:D – Heinrich

1

立即執行返回功能試試這個

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

function b(){ 
    var a; 
    a = z()(); 
} 
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(); 
+0

這可以奏效。我必須嘗試一下。但是,也許我只需要按照既定的方式去做,並通過我的obj作爲參數:(如果你(合理地)問自己爲什麼我想要這個瘋狂的設置,請查看我上面的評論。這將是我最好的選擇解決角度擴展。 – Heinrich

+0

快速的問題 - 爲什麼'返回這個'在z的返回值? – mike

+0

@mike:'obj === c'是匿名函數的'thisVal' – Bergi