2013-11-14 28 views
-1

在以下示例中,y如何給出1的值?我加了一些記錄,看看價值觀和不知道如何/其中y分配...瞭解Javascript函數和關閉

(function() { 
    function foo(x) { 
     var callNum = 0; 
     var baz = 3; 
     return function (y) { 
      callNum++; 
      console.log("callNum: " + callNum); 
      console.log("y: " + y); 
      console.log("baz: " + baz); 
      console.log("x: " + x); 
      console.log(x + y + (++baz)); 
     } 
    } 
var moo = foo(2); // moo is now a closure. 
moo(1); 
moo(1); 
})(); 

這裏的小提琴輸出日誌:

callNum: 1 
    y: 1 
    baz: 3 
    x: 2 
    7 
    callNum: 2 
    y: 1 
    baz: 4 
    x: 2 
    8 
+3

問題應該是:「moo'裏面有什麼?」。一旦你得到了,很清楚'y'得到分配的位置;) –

+2

你爲什麼會期望'y'不是1? – tymeJV

+1

'y'不是「賦值」的,它被傳入函數'moo',這是'foo'返回的函數。兩次,你通過'1',所以它是1. –

回答

2

foo()返回的功能。這個返回的函數接受一個參數,你關心的是y

所以,當你這樣做:

// returns a function that accepts `y` with `x` shared via closure 
var moo = foo(2); 

// execute the inner function, passing in a value for `y`. 
moo(1); 

foo(2)返回的功能。 x現在是2moo現在是一個函數,它接受y的值,並且您通過1。所以y現在是1


想起來了另一種方式,你可以通過執行調用的內部函數:

foo(x)(y); 

或者與值,您正在使用:

foo(2)(1); 

所以,在回答你的問題,y設置爲1當你這樣做:

moo(1); 
0

在您的代碼:

(function() { 
    function foo(x) { 
     var callNum = 0; 
     var baz = 3; 

這些都是無關緊要(XcallNum巴茲)的參數。它們形成包括以下功能關閉:

 return function (y) { 

這個函數有一個封閉到每個外層局部變量(包括FOO)的。

  callNum++; 
      console.log("callNum: " + callNum); 
      console.log("y: " + y); 
      console.log("baz: " + baz); 
      console.log("x: " + x); 
      console.log(x + y + (++baz)); 
     } 
    } 

也有涉及moo和上述兩種功能關閉,但是它沒有使用,因此是不相關的結果。

var moo = foo(2); // moo is now a closure. 

其餘由Alex回答。