2013-02-24 138 views
26

以下代碼片段是一個測試,以查看當函數和變量在同一範圍內共享相同名稱時會發生什麼。在Chrome中,似乎變量定義在引用中具有優先權。函數和變量具有相同的名稱

  1. 命名的函數可以被執行,還是被變量聲明完全掩蓋?
  2. 在Javascript中的標準行爲是變量優先於具有相同名稱的函數嗎?

對不起這兩個部分的問題,但問兩個單獨的問題似乎很浪費。

代碼:

<!DOCTYPE html> 
    <head> 
     <meta charset="utf-8"> 
     <title></title> 
    </head> 
    <body> 
     <script> 

      var overlapping = function() { return 'this is a var holding an anonymous function' }; 

      function overlapping() 
      { 
       return 'this is a function definition'; 
      } 

      output(overlapping, 'overlapping'); 
      output(overlapping(), 'overlapping()'); 

      function output(expression, description) 
      { 
       document.writeln('<li>' + (description ? ('<i>' + description + '</i>: ') : '') + expression + '</li>'); 
      } 
     </script> 
    </body> 
</html> 
+4

我猜的Javascript功能吊到頂部,使得變量定義發生。因此最後一個定義 - 變量 - 就是使用的定義。 – 2013-02-24 22:55:13

回答

15

在JavaScript中,函數的定義提升到當前作用域的頂部。因此,您的示例代碼讀作:

var overlapping = function() { return 'this is a function definition' }; 
var overlapping = function() { return 'this is a var holding an anonymous function' }; 

這是關於這個主題的一些優秀閱讀:函數的定義後http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting

+2

偉大的文章。你可以用任何值覆蓋一個命名的函數似乎確實存在問題,儘管必須有一些設計上的優勢。進入這個問題,我認爲變量和函數是兩個謹慎的項目,因爲沒有錯誤拋出。 – 2013-02-24 23:46:58

+2

也有用:1)http://stackoverflow.com/questions/336859/javascript-var-functionname-function-vs-function-functionname 2)http://javascriptweblog.wordpress.com/2010/07/06/function -declarations-VS-函數表達式/ – 2013-02-25 04:01:39

相關問題