2013-06-28 118 views
3

我「新來的Javascript和編程一般在從一個叫的Javascript啓蒙(第88頁)一書的代碼塊來:調用嵌套匿名函數(JavaScript的)

var parentFunction = function() { 
    var foo = 'foo'; 
    return function() { // anonymous function being returned 
     console.log(foo); // logs 'foo' 
    } 
} 
// nestedFunction refers to the nested function returned from parentFunction 

var nestedFunction = parentFunction(); 

nestedFunction(); /* logs foo because the returned function accesses foo 
via the scope chain */ 

爲什麼並設置var nestedFunction = parentFunction();使nestedFunction();調用嵌套匿名函數和日誌「富」到控制檯,而只使用parentFunction();日誌什麼都沒有

+0

爲什麼富可以訪問即使它應該是超出了範圍,因爲JS使用somehing稱爲封:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures – HMR

回答

3

基本上你正在做的:

parentFunction()(); // double parenthesis 

括號表示您執行該函數,該函數將返回一個值。如果該值爲function,則可以執行該值。

如果你把它只有一次,那麼,你剛纔得到的功能,因此沒有得到console.log GED

+0

啊!這是有道理的。感謝您提供清晰簡明的解釋,並感謝所有回答的人。 – edubba

4

調用parentFunction返回匿名函數不調用它。

nestedFunction獲取設置爲parentFunction匿名函數的回報。因此調用匿名函數

匿名函數使用console.log所以你看到"foo"

0

因爲parentFunction正在返回嵌套函數,需要調用它才能運行。

var a = nestedFunction; 

不記錄任何東西,因爲它沒有被執行,直到你這樣做:

a(); 
0

重寫代碼,因爲這:

var nestedFunction = null; 

var parentFunction = function() { 
    var foo = 'foo'; 
    nestedFunction = function() { // anonymous function being returned 
     console.log(foo); // logs 'foo' 
    } 
} 

parentFunction(); 
// outputs nothing 
// but initializes nestedFunction by its local function 

nestedFunction(); /* logs foo because that local function has access to local 'foo' of 
the parent function */ 

正如你看到的父函數只能通過函數引用來初始化nestedFunction變量。並且該函數引用可以被稱爲任何其他函數。

1

到你的代碼的替代方案是本

var parentFunction = function() { 
    var foo = "foo"; 
    return console.log.bind(console); 
} 

parentFunction()(); 
// => "foo" 

不可避免的,你會希望在某些時候做事情的範圍,所以你會做這樣的

var parentFunction = function() { 
    this.foo = "foo"; 
    this.something = function(){ 
    console.log(this.foo); 
    } 
    return this.something.bind(this); 
} 

parentFunction()(); 
// => "foo" 
1
function add (x) { 
    return function (y) { 
     return x + y; 
    }; 
} 
var add5 = add(5); 
add5(3); 

解釋:

當add函數被調用時,它返回是一種功能。 該函數關閉上下文並記住參數x恰好在那時(即5代碼) 當調用add函數的結果分配給變量add5時,它始終知道x在最初創建時的樣子。 上述ADD5變量是指將在正在發送的值5隨時添加到功能。 這意味着,當ADD5被調用的值爲3,它會一起添加5 3,並返回

請參考以下鏈接...

http://robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/