2010-11-19 171 views
2
(function() { 
    var x = 5; 

    (function() { 
     function f(y) { return (x+y)-2 }; 

     (function() { 
      function g(h) { var x = 7; return h(x) }; 

      (function() { var x=10; z=g(f); })(); 
     })(); 
    })(); 
})(); 

我正在通過我的課堂上的一些問題來爲我們的下一次考試做準備,並且無法弄清楚以上評估的方式。Javascript評估問題(第二部分)

大多數情況下,我不明白調用z = g(f),因爲當f被評估時,它沒有提供參數,所以它如何評估?它怎麼知道你是什麼? g(f)將評估什麼?

另外,據範圍去看,我相信javascript會將大多數所有東西視爲全局變量,因此設置的最後一個x將是函數f中使用的x值,是正確的嗎?

感謝您的幫助!

請注意,這些是我正在練習準備考試的書後面的額外問題,這些不是直接的作業問題。

+0

這不是你剛纔問的那個問題嗎?減少包裝功能。 – 2010-11-19 18:29:37

+0

@meder,它是相似的,但不一樣。 – 2010-11-19 18:31:54

+0

@Matthew Flaschen - 我知道代碼並不完全一樣,但在最後回答中給他的提示應該足以解決這個問題。 – 2010-11-19 18:34:06

回答

1

在這種情況下,g(f)函數f不計算,而是作爲對象/值傳遞。函數是javascript中的值,可以像這樣傳遞。該功能g後來通過表達h(x)計算函數f

這裏有一個更直接的例子

var addOne = function(x) { return x+1; } 
var f = addOne; 
var value = f(4); // Returns 5 
1

它有助於有更好的格式和縮進,使得它更容易(因爲f作爲參數h通過)以調查發生了什麼:

(function() { 
    var x = 5; 
    (function() { 
     function f(y) { // <-- y is the x from function g 
      return (x + y) - 2 
     }; 
     (function() { 
      function g(h) { 
       var x = 7; // <-- local x is defined and passed to f 
       return h(x) // <-- h === f 
      }; 
      (function() { 
       var x = 10; 
       z = g(f); // <-- f is passed to g 
      })() 
     })() 
    })() 
})() 
+0

謝謝,我正在嘗試格式化它,但它讓我很困惑。 ;) – OogaBooga 2010-11-19 18:37:30

1

函數中定義的變量被限定爲該函數的作用域。如果這真的是一個班,你應該從那裏弄清楚其餘的部分。

0

大多數情況下,我不明白的通話 Z =克(F),當f的評估,它 不提供參數,所以如何 它在所有的評價? 如何知道y是什麼? g(f) 會評估什麼?

如果你看一下g是如何實現的:

function g(h) { var x = 7; return h(x) }; 

它需要一個參數h,這是一個Function,然後調用它作爲h(x)。我希望這可以幫助你瞭解z = g(f)如何結束運行功能f

此外,據作用域推移,我相信 JavaScript的對待最 一切爲全局變量,這樣設置是在函數f使用的X 值,正確的 最後x?

不正確。當使用var語句時,將定義本地作用域中的新變量。在你的情況下,最後的x不是全球性的。

+0

我很感謝你的回答,我想我的問題是g(f)評估的是什麼?我猜想,就像我問的最後一個問題,它評估爲10 + 7-2。 – OogaBooga 2010-11-19 18:57:05

+0

ref:http://stackoverflow.com/questions/4227972/javascript-evaluation-questions – OogaBooga 2010-11-19 18:58:53

0

我也beautified它爲了可讀性。

(function() { 
    var x = 5; 

這將設置一個局部變量x至5

(function() { 
     function f(y) { 
      return (x + y) - 2 
     }; 

這就產生了一個局部函數f;注意,上述x(目前5)中是關閉的。

 (function() { 
      function g(h) { 
       var x = 7; 
       return h(x) 
      }; 

我們定義一個函數g採用一個函數h作爲參數。它有一個局部變量x,這影響了另一個。

  (function() { 
       var x = 10; 
       z = g(f); 
      })() 

This x is a red herring;它會影響外圍的一個,並且從未實際使用過。然後我們打電話g,通過f。上面到g,我們看到f變成正式參數h,並且用7調用。在f中,這變成了y。所以我們得到(5 + 7) - 2,10。由於陰影,它是而不是相當於其他的代碼。

外層x從不修改,只是被遮蔽。