2009-06-16 14 views
10

मैं जावा क्लास से आ रहा हूं, इसके क्लास-आधारित विरासत मॉडल के साथ, जावास्क्रिप्ट के प्रोटोटाइप-आधारित विरासत मॉडल के आसपास अपना सिर लेने की कोशिश कर रहा हूं। मुझे जो फेंक रहा है उसका एक हिस्सा, मुझे लगता है कि मेरे पास जावा का अर्थ "यह" दृढ़ता से दिमाग में है - और जावास्क्रिप्ट का "यह" एक बहुत ही अलग जानवर है। मैं समझता हूं कि जावास्क्रिप्ट का "यह" हमेशा फ़ंक्शन के कॉलर को संदर्भित करता है, न कि जिस क्षेत्र में फ़ंक्शन परिभाषित किया गया था - मेरा मतलब है, मैंने इसे पढ़ लिया है और इसका अर्थ क्या है इसका अर्थ है। लेकिन मैं समझदारी को और अधिक गहराई से समझना चाहता हूं, और मुझे लगता है कि इसके लिए एक और नाम होने से मदद मिलेगी। जेएस "यह" के बारे में आप कैसे सोचते हैं? क्या आप हर बार एक मानसिक प्रतिस्थापन करते हैं जब आप इसे पार करते हैं? यदि हां - तो आप किस शब्द या वाक्यांश का उपयोग करते हैं?जावास्क्रिप्ट के "यह" के लिए बेहतर नाम क्या होगा?

+0

पहले सवाल मूर्खतापूर्ण लग रहा था, लेकिन कुछ उत्तर देने के बाद, यह वास्तव में काफी दिलचस्प है ;-) +1 –

उत्तर

17

this यथोचित जावास्क्रिप्ट में context को नाम दिया जा सकता है।

यह वास्तव में वर्तमान क्षेत्र के लिए एक निष्पादन संदर्भ का जिक्र कर रहा है, और जब तक इस संदर्भ एक वर्ग का एक उदाहरण हो सकता है, यह निश्चित रूप से यह किसी भी वस्तु पर सब हो सकता है — होना जरूरी नहीं है, और यह कर सकते हैं रन-टाइम पर संशोधित किया जाना चाहिए।

सबूत है कि एक "विधि" जो भी जावास्क्रिप्ट में "वर्ग" है जिसमें यह परिभाषित किया गया है की एक आवृत्ति पर काम कर रहा है कोई गारंटी नहीं है कि:

function Cat(){ 

    this.texture = 'fluffy'; 

    this.greet = function(){ 
     alert("Pet me, I'm " + this.texture); 
    } 
} 

var cat = new Cat(); 

// Default to using the cat instance as the this pointer 
cat.greet(); // Alerts "Pet me, I'm fluffy" 

// Manually set the value of the this pointer! 
cat.greet.call({texture: 'scaly'}); // Alerts "Pet me, I'm scaly" 

यह वहाँ ध्यान देना महत्वपूर्ण है कि मूल्य this ऑब्जेक्ट पूरी तरह से स्वतंत्र है जहां युक्त फ़ंक्शन को परिभाषित किया गया है।

+0

तो क्या यह कहना सही है कि "यह" कीवर्ड जावास्क्रिप्ट में गतिशील स्कॉइंग को अनुकरण करने की अनुमति देता है? (आम तौर पर सभी कार्यों में व्याख्यात्मक/स्थैतिक गुंजाइश कहा जाता है) – techzen

5

मुझे लगता है कि जावास्क्रिप्ट this जावा के this के मुकाबले बहुत करीब है। ओओपी संदर्भ में, this का अर्थ है "यह उदाहरण"। मुझे लगता है कि जावास्क्रिप्ट के this कीवर्ड के बारे में क्या भ्रमित हो सकता है यह है कि पर संदर्भ के आधार पर अलग-अलग अर्थ हो सकते हैं।

+0

"यह" हमेशा "यह उदाहरण" नहीं है। उदाहरण के लिए, आप Function.call या Function.apply का उपयोग कर किसी भी फ़ंक्शन के लिए मैन्युअल रूप से "इस" का मान सेट कर सकते हैं। – Triptych

+0

दाएं, इसलिए "यह" का अर्थ है "यह उदाहरण" जब तक आप इसे बदल नहीं देते। यह "इस" के प्रारंभिक अर्थ को नहीं बदलता है।तो क्या मुझे लगता है कि आप मुझसे सहमत हैं कि "यह" अत्यधिक प्रासंगिक है? –

+1

आपको वास्तव में विश्वास करना है कि 'यह' कॉलर द्वारा ठीक से सेट किया जा रहा है। उद्देश्य के समान ही मुझे विश्वास है कि 'स्वयं' वास्तव में वर्तमान उदाहरण है। जावा में आप कुछ और को इंगित करने के लिए 'यह' नहीं बदल सकते हैं। – Kekoa

1

'जावास्क्रिप्ट यह' के बारे में कैसे? यह आपको सीधे जो कुछ भी कर रहा है उससे सीधे बंधेगा और मानसिक अनुस्मारक भी प्रदान करेगा कि 'इस' की अवधारणा जिसे आप वर्तमान में काम कर रहे हैं वह जावास्क्रिप्ट अवधारणा है।

आखिरकार, मुझे उम्मीद है कि आप इसे 'जावास्क्रिप्ट' कहकर बंद करना बंद कर देंगे और बस इसे 'यह' कहें, इस संदर्भ में जिसका अर्थ है कि आप जिस काम में काम कर रहे हैं उसका पूरा अर्थ है। मुझे उम्मीद है कि शायद आप जहां भी जाना चाहते हैं, वैसे भी। यह समारोह के संदर्भ है -

+0

हाँ। जेन से माफ करने के साथ: जावास्क्रिप्ट सीखने से पहले पहाड़ पहाड़ हैं; पानी पानी हैं। जब मैंने जावास्क्रिप्ट सीखा, पहाड़ अब पहाड़ और पानी नहीं थे, अब पानी नहीं थे। एक बार जब मैंने जावास्क्रिप्ट को महारत हासिल कर लिया था, पहाड़ फिर से पहाड़ और पानी फिर से पानी थे। –

3

this एक समारोह की कॉलर (हालांकि यह हो सकता है) या गुंजाइश है, जिसमें समारोह परिभाषित किया गया था (हालांकि यह हो सकता है) नहीं है।

स्थानांतरण का मतलब है कि @ एंड्रयू हरे का अर्थ है कि यह आपके भ्रम के स्रोत के करीब है; जेएस के प्रोटोटाइप विरासत तंत्र की वजह से, function कीवर्ड का अर्थ यह हो सकता है कि इसका उपयोग कैसे किया जाता है, जावा की विधि परिभाषा की तुलना में जावा के class के करीब कुछ। ब्राउज़र में

मान लिया जाये कि निष्पादन:

var q = this.document; //this is window 

var o = new (function pseudoconstructor(){ 
    this.property = "something else" //the new keyword changed 'this' to mean 'the object I'm about to return' 
})(); 
9

एक संभावित वैकल्पिक नाम owner होगा। यह आपके दिमाग को दिशा में ले जाएगा कि मालिक किस कोड को निष्पादित कर रहा है उसके आधार पर बदल सकता है।

यह उदाहरण quirksmode से है:

जावास्क्रिप्ट this में हमेशा की तरह हम क्रियान्वित कर रहे हैं, या बल्कि, वस्तु के लिए एक समारोह का एक तरीका है कि समारोह के "मालिक" को दर्शाता है। जब हम अपने वफादार कार्य को किसी पृष्ठ में कुछ() को परिभाषित करते हैं, तो उसका स्वामी पृष्ठ या इसके बजाय, जावास्क्रिप्ट की विंडो ऑब्जेक्ट (या वैश्विक वस्तु) है। एक ऑनक्लिक संपत्ति, हालांकि, एचटीएमएल तत्व के स्वामित्व में है।

निम्न कोड में,

function doSomething() { 
    this.style.color = '#cc0000'; 
} 

और

element.onclick = doSomething; 

, owner अंक उद्देश्य यह है कि विधि जब यह मार डाला जाता है शामिल करने के लिए।

------------ window -------------------------------------- 
|          /\   | 
|           |   | 
|           this   | 
| ----------------      |   | 
| | HTML element | <-- this   ----------------- | 
| ----------------  |   | doSomething() | | 
|    |   |   ----------------- | 
|   --------------------       | 
|   | onclick property |       | 
|   --------------------       | 
|              | 
---------------------------------------------------------- 
+1

मैंने डाउनवोट (अभी तक) नहीं किया है, लेकिन मुझे यह जवाब पसंद नहीं है, क्योंकि यह किसी को यह मानने के लिए प्रेरित करता है कि इस सूचक का मूल्य "हमेशा" यह निर्धारित करता है कि फ़ंक्शन को परिभाषित किया गया है, जो पूरी तरह से असत्य है। – Triptych

0

मैं जैसे छोटे से आसान प्रकार मानसिक मॉडल के साथ उपन्यास वाक्य रचना को अवशोषित:

$(document).ready(function() { 

    function baffle() { 
    alert(this.b); 
    } 

    function what() { 
    this.b = "Hello"; 
    baffle(); 
    } 

    function huh() { 
    this.b = "World"; 
    baffle(); 
    } 

    what(); 
    huh(); 

    } 
); 

लापरवाही, काल्पनिक सी ++ के रूप में यह बुरी तरह से अनुवाद:

template <class This> 
function baffle() { 
    alert(This.b); 
} 

function what() { 
    b = "Hello"; 
    baffle<what>(); 
} 

function huh() { 
    b = "World"; 
    baffle<huh>(); 
} 

what(); 
huh(); 
0

मुझे लगता है कि this ऐतिहासिक कारणों से सबसे उपयुक्त है। जावास्क्रिप्ट में this के लिए वास्तव में एक-आकार-फिट नहीं है, क्योंकि न केवल किसी ऑब्जेक्ट के संदर्भ में प्रक्रियात्मक फ़ंक्शन के संदर्भ में this या this को संदर्भित किया जा सकता है, , लेकिन को Function.apply और Function.call का उपयोग करके स्क्रिप्टर द्वारा भी असाइन किया जा सकता है।

हालांकि, this का अर्थ केवल समायोज्य है क्योंकि जावास्क्रिप्ट और डोम कुछ अजीब तरीकों से काम करते हैं। उदाहरण के लिए, Function.apply का प्राथमिक उपयोग ईवेंट कॉल में किसी तत्व संदर्भ के संदर्भ को संरक्षित करना है। आपने इसे प्रोटोटाई की Function.bind() विधि में देखा होगा।

this उस संदर्भ के लिए प्लेसहोल्डर है जिसमें फ़ंक्शन निष्पादित किया जा रहा है, और इससे कहीं अधिक विशिष्ट होना मुश्किल है। हालांकि, this के अधिकांश उपयोग इसे एक अर्थात् उपयुक्त कीवर्ड बनाते हैं। bind() के मामले में, भले ही हम मनमाने ढंग से फ़ंक्शन के भीतर this के अर्थ को बदलने के तरीकों का उपयोग कर रहे हैं, इसका उपयोग this को इसके मुकाबले अधिक उचित बनाने के लिए किया जाना चाहिए। इवेंट हैंडलर में this के अजीब व्यवहार से कई शौकिया जावास्क्रिप्ट प्रोग्रामर फेंक दिए जाते हैं, और Function.apply का उपयोग "गलत" के लिए किया जाता है।

-1

आत्मनिर्भर तर्क (स्वयं या यह) स्वयं (अन्य) के अलावा काम करने के लिए विरोधाभास से बचाता है। स्वयं (यह) सबकुछ और सभी को एक साथ रखेगा, यह किसी भी उदाहरण के साथ स्थिर और क्लास विधि (स्थैतिक) के साथ स्थिर रह सकता है। विरोधाभासों से बचने के लिए, आत्मविश्वास से बचें और तर्क सभी सच्चाई को साबित और उपाध्यक्ष रखता है, सभी सिद्ध सत्य हैं।

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