2012-03-16 14 views
29

में हो सकता है मैं निम्नलिखित की तर्ज पर एक समारोह है:'इस' कभी अशक्त जावास्क्रिप्ट

doSomething: function() { 
     var parent = null; 

     if (this === null) { 
      parent = 'some default value'; 
     } else { 
      parent = this.SomeValue(); 
     } 
    } 

माता पिता कभी 'कुछ डिफ़ॉल्ट मान' लिए सेट किया जा सकता है या नल ज़रूरत से ज़्यादा के लिए चेक है ?

वैकल्पिक रूप से, क्या हुआ अगर मैं कम प्रतिबंधक प्रयोग किया है:

doSomething: function() { 
     var parent = this ? this.SomeValue() : 'some default value'; 
    } 

माता पिता कभी इस मामले में 'कुछ डिफ़ॉल्ट मान' पर सेट हो सकता है?

उत्तर

36

गैर-सख्त मोड में, this में Object(this) परिवर्तन आया है, इसलिए यह हमेशा सत्य है। अपवाद null और undefined हैं जो वैश्विक वस्तु पर मानचित्र हैं। तो this कभी भी null और हमेशा सच्चाई नहीं है, दोनों चेक अनिवार्य बनाते हैं।

सख्त मोड में, हालांकि, this ऐसा कुछ भी हो सकता है जिससे आपको देखना होगा। लेकिन फिर फिर आपको सख्त मोड के लिए चुनना होगा, इसलिए यदि आप ऐसा नहीं करते हैं तो कोई चिंता नहीं है।

(function() {    return this; }).call(null); // global object 
(function() { "use strict"; return this; }).call(null); // null 

ES5 की specification का कहना है:

thisArg मूल्य संशोधन के बिना पारित हो जाता है इस मूल्य के रूप में। यह संस्करण 3 से एक परिवर्तन है, जहां एक अपरिभाषित या शून्य यह आर्ग के साथ प्रतिस्थापित किया गया है वैश्विक ऑब्जेक्ट और ToObject अन्य सभी मानों पर लागू होता है और परिणाम इस मान के रूप में पारित किया जाता है।

+0

ऐसा लगता है कि इस तरह की संपत्ति के बिना "SomeValue()" एक वस्तु पर फ़ंक्शन को कॉल करने का प्रयास एक * थोड़ा * चिंता का कारण हो सकता है। – Pointy

+0

खैर, तकनीकी रूप से यह हमेशा ऑब्जेक्ट (यह) 'नहीं आया है, क्योंकि यदि यह एक वस्तु है, तो यह और अधिक महत्वपूर्ण बात नहीं है, अगर यह प्रारंभ में 'शून्य' या 'अपरिभाषित' था तो यह या तो नहीं है , यह सीधे वैश्विक वस्तु पर सेट है। – davin

+0

@ डेविन: वास्तव में किसी ऑब्जेक्ट के लिए इससे कोई फर्क नहीं पड़ता कि यह करता है ('ऑब्जेक्ट (obj) === obj'), लेकिन आपके दूसरे बिंदु के लिए, आप पूरी तरह से सही हैं। – pimvdb

2

हालांकि आपके प्रश्न का सीधा जवाब नहीं है .. ब्राउज़र में 'यह' डिफ़ॉल्ट रूप से 'विंडो' ऑब्जेक्ट को संदर्भित करेगा। नोडज पर यह वैश्विक वस्तु का संदर्भ देगा।

मुझे यकीन नहीं है कि क्या ऐसा कोई मामला है जहां यह शून्य हो सकता है, लेकिन यह कम से कम असामान्य होगा।

+0

Welp .. मैं अपना जवाब छोड़ दूंगा क्योंकि यह उपयोगी हो सकता है, लेकिन pimvdb का बेहतर जवाब है :) – Evert

2

this कीवर्ड कभी भी शून्य नहीं होना चाहिए, लेकिन हो सकता है कि आप इसकी अपेक्षा न करें। यदि आप सावधान नहीं हैं तो आप window ऑब्जेक्ट को संदर्भित कर सकते हैं।

आपके मामले में, मुझे विश्वास है कि this को doSomething फ़ंक्शन का संदर्भ लेना चाहिए।

var myObject = { 
    myMethod: function() { 
     console.log(this); 
    } 
}; 

myObject.myMethod(); // prints out a reference to the myMethod function 

यहां jsFiddle है।

0

नहीं this का मान कभी भी 'some default value' टेक्स्ट नहीं होगा।

0

this शून्य नहीं हो सकता है। अगर यह शून्य था, तो आप विधि के दायरे में नहीं हो सका।

1

यदि आप जावास्क्रिप्ट को किसी भी ब्राउज़र में शून्य नलिका का उपयोग करने के लिए मजबूर करने का प्रयास करते हैं तो आप क्या देख सकते हैं।मैं एक उदाहरण यहां की गईं:

http://jsfiddle.net/rXsWj/

संक्षेप में, यह अनुभव साबित करता है कि ब्राउज़र परिवर्तन 'अशक्त' के लिए मक्खी पर 'विंडो'। यदि इसके बजाय आप 'ए' में शून्य बदलते हैं, तो आपको 'ए' की एक चेतावनी दिखाई देगी जैसा आप उम्मीद करेंगे। संदर्भ के रूप में लिंक से कोड:

function a() { 
    alert(this) 
} 

a.apply(null) 

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