typeof

2012-10-17 9 views
5

मैं objtypeof

एक चर obj कुछ भी हो सकता है, और मैं अगर obj एक समारोह है पता लगाने के लिए चाहते हैं। आम तौर पर मैं क्या करना होगा

typeof obj === 'function' 

समस्या आईई < = 8 में है जब obj एक देशी समारोह (कम से कम यह window.open और window.alert के साथ होता है पता है) है। आईई टाइपऑफ ओबीजे में जब ऑब्जेक्ट होता है window.open === 'ऑब्जेक्ट'

क्या यह जांचने का एक विश्वसनीय तरीका है कि window.open वास्तव में एक फ़ंक्शन है या नहीं?

मैं jQuery देखना भी इस

$.isFunction(window.open) => false //in IE 

पर विफल रहता है इस apperantly jQuery 1.3 या कुछ और, यकीन नहीं कि वे किस तरह यह है कि पहले परीक्षण किया में हटा दिया गया।

जोड़ा गया: एक तरह से यदि यह एक त्रुटि फेंक नहीं है तो विंडो खुली एक समारोह है

Function.prototype.apply.apply(window.open) 

कॉल करने के लिए होने लगते हैं। यदि आप

Function.prototype.apply.apply({}) 

फिर आईई एक त्रुटि "फंक्शन अपेक्षित" फेंकता है।

if (window.open) { 
    window.open(...) 
} 

किसी देशी अधिलेखित कर देता है, तो: लेकिन यह शायद ही यदि किसी वैरिएबल एक समारोह है की जाँच करने के लिए एक विंडो खोलने के लिए एक अच्छा समाधान ..

+2

तो यह आईई में मूल कार्यों के लिए सिर्फ एक मुद्दा है जो टाइपिंग ऑब्जेक्ट लौटा रहा है, लेकिन उपयोगकर्ता परिभाषित फ़ंक्शन टाइपिंग फ़ंक्शन लौट रहे हैं? यह जांचने के लिए पर्याप्त क्यों नहीं है कि मूल कार्य मौजूद है i.e 'window.open! == अपरिभाषित'? आपको मूल कार्यों की आवश्यकता क्यों है, जिन्हें ऐसा करने के लिए दस्तावेज किया गया है? क्षमा करें बस अपनी विचार प्रक्रिया को समझने की कोशिश कर रहा है। – Scott

+0

@ 1.2 और "फ़ंक्शन" शाब्दिक के लिए इसका परीक्षण देखें; http://code.google.com/p/jqueryjs/downloads/detail?name=jquery-1.2.js –

+0

^@ एलेक्सके के लिंक से प्रासंगिक कोड 'वापसी !! fn && typeof fn! = "string" && ! fn.nodeName && fn.constructor! = ऐरे && /function/i.test (fn + ""); 'जहां fn फ़ंक्शन नाम – Scott

उत्तर

0

यह देशी ब्राउज़र कार्यों की बात आती है, सुविधा का पता लगाने के लिए पर्याप्त होना चाहिए कार्य, फिर उनके कोड का उपयोग न करें। उन्हें यह नहीं करना चाहिए, और आप समस्याओं के लिए पूछ रहे हैं।

कुछ संदर्भ के बिना इस प्रश्न का उत्तर देना भी मुश्किल है। आप obj में गुजर रहे हैं और इसे एक फ़ंक्शन के रूप में आमंत्रित कर रहे हैं। यदि आप कई डेटा प्रकारों में गुजर रहे हैं और इस प्रकार के आधार पर कुछ अलग कर रहे हैं, तो मैं तर्क दूंगा कि आपको यहां फ़ंक्शंस नहीं सौंपना चाहिए। ब्राउज़र क्विर्क की वजह से, गतिशील रूप से किसी अन्य फ़ंक्शन को कॉल करने के लिए फ़ंक्शन बनाएं और त्रुटि जांच न करें।

+0

मैं ईमानदारी से अब याद नहीं करता कि यह पूछने का कारण क्या था। –