2013-07-11 21 views
17

Tôi đã đọc qua nguồn cho _.isFunction() chức năng và nhìn thấy dòng này:tại sao typeof (/./) == 'chức năng' được sử dụng trong gạch

if (typeof (/./) !== 'function') { 

và tôi không hiểu tại sao nó đó. /./ là một regex luôn có vẻ như có loại object. Tại sao không phải _.isFunctionđược xác định lại nếu /./ loại là function?

+4

Đã trả lời ở đây: http://stackoverflow.com/questions/5054352/why-use-typeof-for-identifying-a-function/5054396#5054396 – Dogbert

+0

Ah, vì vậy, kiểm tra là để tránh vô tình có chức năng xem xét regex? Tốt đẹp. Câu hỏi hay. – ZenMaster

+3

"Tại sao không _.isFunction được xác định" - nó đang được định nghĩa lại. Định nghĩa toString() ban đầu là hai khối. – Rup

Trả lời

16

Một số phiên bản của động cơ Javascript khác nhau đã cho phép gọiRegExp như một cách khác để sử dụng .exec():

var pattern = /./; 

pattern('abc'); 
pattern.exec('abc'); 

Và, kể từ khi họ Callable, typeof considered them functions:

Loại val: Đối tượng (gốc hoặc chủ và thực hiện [[Gọi]])
Kết quả: "function"

Theo tôi, các phiên bản hiện tại không thể hiện hành vi này và sẽ ném TypeError. Tuy nhiên, nếu bạn lo ngại về khả năng tương thích ngược, như Underscore, bạn có thể cần kiểm tra nó.

+0

@ruakh Từ những gì tôi có thể nói, chúng phải được ghép nối - trừ khi động cơ sử dụng một alt của ['[[Call]]'] (http://es5.github.io/#x15.3.4.5.1) để làm cho chúng có thể gọi được. Bạn có biết một ví dụ? –

+0

Rất tiếc, xin lỗi, tôi đã đọc sai câu trả lời mà Dogbert đã liên kết và nghĩ rằng Firefox 3.6.13 đã sử dụng một công cụ như vậy. Vì vậy, bình luận ở trên của tôi là (có thể) sai; Tôi sẽ xóa nó. – ruakh