Tôi có biến objtypeof trong IE <= 8 cho các hàm gốc
obj có thể là bất kỳ thứ gì và tôi muốn phát hiện xem hàm obj có phải là hàm hay không. Thông thường tôi sẽ làm
typeof obj === 'function'
Vấn đề là trong IE < = 8 khi obj là một chức năng có nguồn gốc (ít nhất là biết điều đó xảy ra với window.open và window.alert). Trong IE typeof obj khi đối tượng là window.open === 'object'
Có cách nào đáng tin cậy để kiểm tra xem window.open có thực sự là một hàm hay không?
tôi thấy jQuery cũng thất bại về vấn đề này
$.isFunction(window.open) => false //in IE
này apperantly bị loại bỏ trong jquery 1.3 hoặc một cái gì đó, không chắc chắn làm thế nào họ đã kiểm tra nó trước đó.
Added: Một cách dường như là để gọi
Function.prototype.apply.apply(window.open)
Nếu điều này không ném ra một lỗi, sau đó cửa sổ đang mở là một hàm. Nếu bạn làm
Function.prototype.apply.apply({})
Sau đó, IE sẽ gửi lỗi "Chức năng được mong đợi". Nhưng nó là khó có một giải pháp tốt để mở một cửa sổ để kiểm tra xem một biến là một chức năng ..
Vì vậy, đây chỉ là một vấn đề đối với các hàm gốc trong đối tượng typeof trả về của IE, nhưng các hàm do người dùng định nghĩa đang trả về hàm typeof? Tại sao nó không đủ để chỉ kiểm tra rằng các chức năng bản địa tồn tại tức là 'window.open! == undefined'? Tại sao bạn cần các hàm gốc, được ghi lại để làm điều này? Xin lỗi, chỉ cần cố gắng hiểu quy trình suy nghĩ của bạn. – Scott
Hãy xem @ 1.2 & thử nghiệm của nó cho "chức năng" theo nghĩa đen; http://code.google.com/p/jqueryjs/downloads/detail?name=jquery-1.2.js –
^Mã có liên quan từ liên kết của @ AlexK. 'return !! fn && typeof fn! =" string "&& fn.nodeName && fn.constructor! = Array && /function/i.test (fn + ""); 'trong đó fn là tên hàm – Scott