फ़ंक्शन के `this` कीवर्ड का मान किसी गेटर से लौटाया जाता है


15

मुझे निम्नलिखित उदाहरण में इस कीवर्ड का अप्रत्याशित मूल्य मिला :

let x = {
    z : 10 ,
    get func1() {
        return function(v) {
            console.log(this === v);
        }
    }
}


x.func1(x)

इस कीवर्ड का मूल्य ऑब्जेक्ट x है जैसे कि इसे उस ऑब्जेक्ट से निष्पादित किया जाता है, मैं केवल उस फ़ंक्शन को प्राप्त करने की अपेक्षा करता हूं जिसमें यह कीवर्ड कॉलिंग ऑब्जेक्ट x के बराबर है

यह उदाहरण हमें अंतर दिखाता है

let x = {
    func2() {
        return function(v) {
            console.log(this === v);
        }
    }
}

x.func2()(x);

दोनों उदाहरणों में func1 जो कि getter फ़ंक्शन है, और func2 जो ऑब्जेक्ट का एक तरीका है, ऑब्जेक्ट x से निष्पादित किया जाता है , और लौटाए गए फ़ंक्शन को तब निष्पादित किया जाता है। इसलिए पहले उदाहरण में यह मान ऑब्जेक्ट x के बजाय वैश्विक ऑब्जेक्ट के बराबर नहीं है ।


3
वास्तव में, वास्तव में दिलचस्प सवाल। मैं हालांकि इस शिकन से पहले कभी नहीं था।
टीजे क्राउडर

1
" जैसे कि वह उस वस्तु से मार डाला है " - लेकिन यह है कि वस्तु को फांसी दे, वहीं: x.func1()
बरगी

जवाबों:


13

यह एक बहुत ही दिलचस्प सवाल है।

ऐसा इसलिए है क्योंकि संपत्ति के उपयोग के परिणाम के तुरंत बाद फ़ंक्शन को बुलाया जा रहा है। तो ये मौलिक रूप से समतुल्य हैं:

let x = {
    get func1() {
        return function(v) {
            console.log(this === v);
        };
    },
    func2(v) {
        console.log(this === v);
    }
};

x.func1(x);
x.func2(x);

दोनों मामलों में:

  1. संपत्ति का मूल्य पढ़ा जाता है, जिसके परिणामस्वरूप एक फ़ंक्शन संदर्भ होता है।
  2. उस फ़ंक्शन को समान प्रॉपर्टी एक्सेस अभिव्यक्ति के हिस्से के रूप में निष्पादित किया जाता है।

तथ्य यह func1है कि एक गौण संपत्ति है और func2एक डेटा संपत्ति कोई फर्क नहीं पड़ता है। यह है कि संपत्ति को पढ़ने से उत्पन्न मूल्य का उपयोग कैसे किया जाता है जो मायने रखता है।


1
मुझे लगा कि पूरी अभिव्यक्ति का मूल्यांकन फ़ंक्शन ऑब्जेक्ट के लिए किया जाएगा और फिर निष्पादित किया जाएगा। धन्यवाद मिल गया
किरोएलोस नासर

1
@KirollosNasr हां, यह है, लेकिन अभिव्यक्ति में x.func1यह संदर्भ को xबाद की कॉल के लिए संदर्भ के रूप में रखता है , इसके विपरीत x.func2()(आपके प्रश्न से) जो एक फ़ंक्शन का मूल्यांकन करता है, लेकिन एक सदस्य एक्सेस अभिव्यक्ति नहीं है।
बर्गी

1
@ बर्गी - मुझे लगता है कि आपका मतलब है x.func2()(x);?
टीजे क्राउडर

1
@TJCrowder हां, मैं अंदर के भावों का उल्लेख करता हूं x.func1(x)औरx.func2()(x)
Bergi

1
@ बर्गी हाँ, यह एक मुश्किल हिस्सा है। लेकिन अब यह अधिक स्पष्ट है कि टीजे
क्राउडर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.