2011-09-06 45 views
3

我希望變量i是一個計數器,但它每次都被初始化爲100在JavaScript中關閉

如何直接撥打myFunction().f()

function myFunction() { 
    var i=100; 
    function f() { 
     i=i+1; 
     return i; 
    } 
    return f(); // with parenthesis 
}; 
var X = myFunction(); 
console.log(X); 
X = myFunction(); 
console.log(X); 
+0

閉合的目的是將變量作用域保留在函數中,但它們在函數返回後保持其狀態。哎呀。這是爲了回覆別人對「關閉的目的是什麼?」的評論。 –

回答

9

您不能直接撥打f。它封裝在一個閉包中,其關鍵點在於關閉所有局部變量。你必須將其暴露在myFunction之外。

第一:

return f; //(); // withOUT parenthesis 

然後就叫X,因爲你必須指定一個函數,。

var X = myFunction(); 
X(); 
+0

謝謝昆汀!當我第二次console.log(X())時,它仍然返回101. –

+2

它不[當我嘗試它](http://jsfiddle.net/zhmng/) – Quentin

+0

好吧,我明白了!謝謝! (我也是第二次分配X = myFunction(),這是錯誤的)。 –

2

這個例子會返回101和102:Be sure to try it.

function myFunction() { 
    var i=100; 
    function f() { 
     i=i+1; 
     return i; 
    } 
    return f; // without any parenthesis 
}; 
var X = myFunction(); 
// X is a function here 
console.log(X()); 
// when you call it, variable i gets incremented 
console.log(X()); 
// now you can only access i by means of calling X() 
// variable i is protected by the closure 

如果您需要調用myFunction().f(),這將是一個毫無意義的一種封閉的:

function myFunction() { 
    var i=100; 
    function f() { 
     i=i+1; 
     return i; 
    } 
    return {x : f} 
}; 
var X = myFunction().x(); 
// X now contains 101 
var X = myFunction().x(); 
// X still contains 101 
// pointless, isn't it? 
+0

這返回101兩次。我想它返回101,102. –

+0

嗯,我想了解使用閉包的正確方法。我不想學習那種毫無意義的封閉。 –

+0

哦,我明白了......你向我展示了正確的方式和錯誤的方式...... –