2014-09-17 20 views
23

Tôi có một khối mã JavaScript như dưới đây trong trang html của tôi. Khi tôi chạy điều này bằng cách tải trang. Tôi nhận được sản lượng dưới đây trên bảng điều khiển trình duyệt của mình."Loại lỗi không xác định: không xác định không phải là một hàm" trong khối mã JavaScript

outer world 
Uncaught TypeError: undefined is not a function 

Như bạn có thể thấy trong đoạn mã, tôi không thực hiện các hàm có tên b bất cứ nơi nào trong các mã. Nhưng khi chạy mã, đầu ra từ hàm đó sẽ đến cùng với một số undefined is not a function error mà tôi không thể tìm thấy ở bất kỳ vị trí nào trong khối mã của mình.

Để thêm nhiều hơn vào trường hợp này, không có nhật ký nào khi tôi xóa bất kỳ phần nào trong mã. đó là. Nếu tôi loại bỏ b khởi tạo từ mã sau đó không có lỗi và đầu ra. Ngoài ra nếu tôi loại bỏ khối chức năng tự thực thi, không có nhật ký hoặc lỗi nào. Đúng là dòng khởi tạo của b thiếu dấu chấm phẩy. nhưng những gì tempts nó để cung cấp như một đầu ra confuses tôi. Bạn sẽ giúp tôi ra để tìm ra một lý do cho hành vi này?

Bạn có thể vui lòng giúp tôi hiểu tại sao nó xảy ra như vậy không?

var b = function() { 
 
    console.log('outer world'); 
 
} 
 

 
(function() { 
 

 
})();

Trả lời

32

Bỏ lỡ một ; sau khi tuyên bố b. Đoạn mã sau là tương đương với những gì bạn có.

var b = function() { 
    console.log ('outer world'); 
}(function() {})(); 

Nếu không có ; b trở thành s tự thực hiện và lấy một hàm rỗng làm tham số. Sau đó nó tự hành xử lần nữa; tuy nhiên, vì b không trả về một hàm, bạn nhận được một ngoại lệ.

Tôi khuyên bạn không nên bỏ qua ; cho đến khi bạn trở thành ninja js :). Giữ b bên trong để tránh ô nhiễm phạm vi toàn cầu.

(function() { 
    "use strict"; 

    var b = function() { 
     console.log("hi"); 
    }; 
    // other code 
}()); 

Semicolon auto-insertion discussion

Trong trường hợp bạn không muốn dấu chấm phẩy, thêm một nhà điều hành trước khi tự chạy chức năng

var b = function() { console.log('outer world') } 
;(function() { /* ... */ }()) 
+6

Cuối cùng, một ví dụ mà Javascript không tự động chèn dấu chấm phẩy ở đó có vẻ trực quan để thêm nó! – Barmar

+5

Bất cứ điều gì bắt đầu bằng '(' hay '[' cần ';' trước đó. – kornieff

+0

Vâng. Điều này giúp tôi hiểu kịch bản. Bạn sẽ mã hóa các liên kết mà Barmar cung cấp trong câu trả lời của Rickard Staaf. Nó giúp tôi hiểu nó hơn. – mithunsatheesh

5

Bạn cần một dấu chấm phẩy sau khi khai var của bạn, và bằng cách này, hãy loại bỏ những khoảng trống giữa log và (

var b = function() { 
     console.log('outer world'); 
}; 
+0

bạn có thể cung cấp một lời giải thích khi chúng tôi thả ruột kết bán như thế nào cho ví dụ một đầu ra. Điều gì đã xảy ra trong nền mà tôi không có trong mã của tôi ?. Tôi dint thực hiện b tại bất kỳ điểm nào – mithunsatheesh

+0

Đọc câu trả lời của @ kornieff. Và xem http://stackoverflow.com/questions/2846283/what-are-the-rules-for-javascripts-automatic-semicolon-insertion-asi – Barmar

+0

Nó sẽ cố gắng thực hiện chức năng được xác định của bạn xuất ra console.log và gửi nó là tham số của một hàm ẩn danh mới, sau đó ở cuối bạn đang cố gắng thực hiện một hàm không tồn tại, bởi vì những gì bạn có tại thời điểm đó không còn là một hàm nữa. –

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