2016-08-08 9 views
7

Underscore.js में isFunction(object) (repo link to definition) के लिए वैकल्पिक ओवरराइड, के रूप में पढ़ता:Underscore.js, क्यों `isFunction` उपयोग` करता है || FALSE`?

// Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8, 
// IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236). 
var nodelist = root.document && root.document.childNodes; 
if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') { 
    _.isFunction = function(obj) { 
     return typeof obj == 'function' || false; 
    }; 
} 

क्या मैं लेकर संदेह में हूँ || false, एक स्ट्रिंग तुलना के बाद क्यों आवश्यक है? चूंकि typeof हमेशा एक स्ट्रिंग रिटर्न वहाँ कोई अस्पष्टता नहीं होना चाहिए?
टिप्पणी राज्यों ओवरराइड कुछ typeof कीड़े कर रहे हैं सूचीबद्ध प्लेटफार्मों पर मामलों को ठीक करता है, वहाँ जब typeof एक स्ट्रिंग वापस नहीं करता है?

उत्तर

6

टिप्पणियों में शामिल मुद्दों को देखें, #1621, #1929 और #2236

कुछ ही समय में कहें, कुछ प्लेटफॉर्म एक बग जहां typeof एक स्ट्रिंग जब तक आप एक चर में संग्रहीत नहीं है।
|| false फिक्स एक अतिरिक्त चर शुरू करने के बिना इस मुद्दे।

#1621 से सीधे लिया गया: एक चर सब कुछ के साथ

IE8 में, के रूप में की उम्मीद काम करता है:

var t = typeof obj 
t === 'function' // false 
t === 'object' // true 

लेकिन बिना एक, चीजों को अलग कर रहे हैं:

(typeof obj) === 'function' // true, but SHOULD be false 
(typeof obj) === 'object' // true 

अतिरिक्त जांच उल्लिखित ऊपर बग ठीक करता है।

संबंधित मुद्दे