2015-09-25 14 views
5

Tôi đã đoạn mã sau vào tập tin HTML của tôi:Tại sao chức năng được gọi? JavaScript/Window

<script type="text/javascript"> 
     window.never = function() { 
       console.log('this function is never called'); 
     } 
     (function(d, s, id){ 
      var js, srjs = d.getElementsByTagName(s)[0]; 
      if (d.getElementById(id)) {return;} 
      js = d.createElement(s); js.id = id; 
      js.src = "this.script.does.not.exist.js"; 
      srjs.parentNode.insertBefore(js, srjs); 
     }(document, 'script', 'streamrail-jssdk')); 
    </script> 

Xem fiddle: http://jsfiddle.net/sebvaeja/

Nhìn vào giao diện điều khiển, bạn có thể thấy rằng window.never chức năng là thực sự gọi là ('chức năng này là không bao giờ được gọi là 'được ghi vào bàn điều khiển).

Khi gỡ lỗi này bằng các công cụ dành cho Chrome, tôi thấy trong ngăn xếp cuộc gọi mà người gọi đã đóng (dòng đầu tiên: http://jsfiddle.net/sebvaeja/).

Nếu tôi thay đổi không bao giờ hoạt động để được ra khỏi phạm vi toàn cầu:

function never() { 
      console.log('this function is never called'); 
    } 

Sau đó, nó không được gọi.

Ai đó có thể giải thích tại sao hàm window.never được gọi? Điều gì đang kích hoạt cuộc gọi? Tôi đoán nó có một cái gì đó để làm với các chức năng được trên đối tượng cửa sổ, nhưng tôi không thể thấy lý do đằng sau đó.

+0

Nói một cách đơn giản, bạn có lỗi cú pháp. :) – isherwood

+0

Ngoài ra đây là một bản sao nhưng tôi không thể tìm thấy nó. –

+1

'var log = function() {console.log ('hàm này được gọi là'); } (42) ' –

Trả lời

13

Khái niệm chức năng được theo sau bởi dấu ngoặc đơn:

window.never = function() { ... } 
(...) 

Các ngắt dòng sau khi các biểu hiện chức năng không không chấm dứt tuyên bố biến, vì vậy cho phân tích cú pháp đó là một cuộc gọi chức năng:

function() { ... }(...) 

Thực tế, bạn đang sử dụng cùng một kỹ thuật ở đây:

(function(d, s, id){ 
    // ... 
}(document, 'script', 'streamrail-jssdk')) 

Đó là biểu thức hàm theo sau là (...) và nó gọi hàm.

Giải pháp: Thêm dấu chấm phẩy sau định nghĩa và bạn tốt.


Nếu tôi thay đổi không bao giờ hoạt động để được ra khỏi phạm vi toàn cầu ... Sau đó nó không được gọi.

Trong trường hợp đó định nghĩa hàm được hiểu là hàm khai báo, không biểu thức. Khai báo hàm giống như một tuyên bố và do đó không thể là một phần của một CallExpression. Do đó, dấu ngoặc đơn sau đây được hiểu là toán tử nhóm (như bạn dự định).

5

Đặt dấu chấm phẩy sau khi khai báo hàm:

window.never = function() { 
      console.log('this function is never called'); 
    }; 

Đó là vì các (...) trực tiếp sau đó kích hoạt cuộc gọi chức năng.

window.never = function() { 
      console.log('this function is never called'); 
    } 
    (...) // <-- Triggers call of `window.never` 
Các vấn đề liên quan