2013-02-24 37 views
26

Đoạn mã sau đây là một thử nghiệm để xem điều gì xảy ra khi một hàm và một biến có cùng tên trong cùng một phạm vi. Trong Chrome, có vẻ như định nghĩa biến được ưu tiên trong tham chiếu.Chức năng và biến có cùng tên

  1. Chức năng được đặt tên có thể được thực hiện hoặc bị che khuất hoàn toàn bởi tuyên bố biến không?
  2. Đây có phải là hành vi tiêu chuẩn trong Javascript mà các biến được ưu tiên hơn các hàm có cùng tên không?

Xin lỗi câu hỏi hai phần, nhưng có vẻ như lãng phí khi đặt hai câu hỏi riêng biệt.

Code:

<!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

Tôi đoán rằng Javascript Tời chức năng để phía trên, làm cho định nghĩa biến xảy ra sau khi định nghĩa hàm. Do đó định nghĩa cuối cùng - biến - là biến được sử dụng. –

Trả lời

15

Trong JavaScript, định nghĩa chức năng được kéo lên đến đỉnh phạm vi hiện tại. do đó mã ví dụ của bạn đọc như:

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

Đây là một số đọc tốt về chủ đề này: http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting

+2

Bài viết hay. Thực tế là bạn có thể ghi đè lên một chức năng được đặt tên với bất kỳ giá trị có vẻ thực sự có vấn đề, mặc dù phải có một số lợi thế thiết kế. Đi sâu vào câu hỏi này tôi giả định rằng biến và hàm được giữ như hai mục kín đáo vì không có lỗi nào được ném ra. –

+2

Cũng hữu ích: 1) http://stackoverflow.com/questions/336859/javascript-var-functionname-function-vs-function-functionname 2) http://javascriptweblog.wordpress.com/2010/07/06/function -declarations-vs-function-expressions / –

Các vấn đề liên quan