क्यों एक गुमनाम समारोह में जावास्क्रिप्ट वर्ग एम्बेड () कहते हैं?

वोट
17

मैं कहा जाता है Microsoft से नए JavaScript जैसी भाषा के बारे में पढ़ रहा था टाइपप्रति । में खेल का मैदान (उदाहरण के अनुभाग) , वहाँ टाइपप्रति वाक्य रचना में एक साधारण वर्ग जावा स्क्रिप्ट कोड में बदला है। एक जावा प्रोग्रामिंग पृष्ठभूमि से आ रहा है, यह मुझे जानने के लिए के रूप में टाइपप्रति से संकलित कैसे OOP जावास्क्रिप्ट में किया जाता है दिलचस्प था।

टाइपप्रति कोड:

class Greeter {
    greeting: string;
    constructor (message: string) {
        this.greeting = message;
    }
    greet() {
        return Hello,  + this.greeting;
    }
}   

var greeter = new Greeter(world);

var button = document.createElement('button')
button.innerText = Say Hello
button.onclick = function() {
    alert(greeter.greet())
}

document.body.appendChild(button)

और बराबर जावा स्क्रिप्ट कोड:

var Greeter = (function () {
    function Greeter(message) {
        this.greeting = message;
    }
    Greeter.prototype.greet = function () {
        return Hello,  + this.greeting;
    };
    return Greeter;
})();
var greeter = new Greeter(world);
var button = document.createElement('button');
button.innerText = Say Hello;
button.onclick = function () {
    alert(greeter.greet());
};
document.body.appendChild(button);

टाइपप्रति हिस्सा तो मैं समझता हूँ कि बहुत जावा के समान है। अब मेरे सवाल क्यों जावास्क्रिप्ट में के शरीर है Greeterवर्ग एक एक अनाम में अंतर्निहित है function()कॉल?

क्यों नहीं इस तरह इसे लिखने?

function Greeter(message) {
    this.greeting = message;
}
Greeter.prototype.greet = function () {
    return Hello,  + this.greeting;
};

प्रत्येक विधि का लाभ / नुकसान क्या है?

02/10/2012 को 15:27
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


6 जवाब

वोट
14

निम्नलिखित एक कहा जाता है तुरंत लागू समारोह अभिव्यक्ति :

(function(){ ... })();

यह वैश्विक गुंजाइश साफ रखने के लिए प्रयोग किया जाता है। हालांकि, इस मामले में यह आवश्यक नहीं है के बाद से वापसी मान एक चर को असाइन किया गया है Greeter। केवल समय इस पद्धति उपयोगी होता है जब आप चाहते हैं "निजी" है स्थिर सदस्य हैं।

उदाहरण के लिए:

var Greeter = (function () {
    var foo = 'foo', bar = 'bar'; /* only accessible from function's defined
                                     in the local scope ... */

    function Greeter(message) {
        this.greeting = message;
    }
    Greeter.prototype.greet = function () {
        return "Hello, " + this.greeting;
    };
    return Greeter;
})();
02/10/2012 को 15:30
का स्रोत उपयोगकर्ता

वोट
3

स्पष्ट scoping / बंद तर्क इसके अलावा। को उस अज्ञात फ़ंक्शन ही तुरंत invokes पूर्व भार (व्याख्या) वर्ग परिभाषा का उपयोग करना। यह किसी भी JIT अनुकूलन सामने निष्पादन में लोड करने के लिए अनुमति देता है। छोटा है, बड़ा और अधिक जटिल अनुप्रयोगों के लिए में यह प्रदर्शन में सुधार होगा।

02/10/2012 को 15:44
का स्रोत उपयोगकर्ता

वोट
2

यह निजी सदस्यों के लिए अनुमति देने के लिए है। इस उदाहरण में, सभी सदस्यों तो अपने दो निर्माण बराबर हैं सार्वजनिक कर रहे हैं। हालांकि, अगर आप निजी सदस्यों के लिए प्रदान करना चाहते हैं तो आप उन्हें एक बंद के माध्यम से बुला दायरे से छिपाने के लिए की जरूरत है। इस प्रकार आप तो जैसे एक निजी सदस्य अगर:

class Greeter {
    private greeting: string;
    constructor (message: string) {
        this.greeting = message;
    }
    greet() {
        return "Hello, " + this.greeting;
    }
} 

आप शायद कुछ इस तरह मिलेगा:

var Greeter = (function () {
    var greeting="";
    function Greeter(message) {
        greeting = message;
    }
    Greeter.prototype.greet = function () {
        return "Hello, " + greeting;
    };
    return Greeter;
})();

ग्रीटिंग चर गुमनाम समारोह के अंदर परिभाषित किसी भी समारोह के लिए उपलब्ध हो, लेकिन अन्य सभी स्थानों अदृश्य होगा।

02/10/2012 को 15:36
का स्रोत उपयोगकर्ता

वोट
2

गुमनाम समारोह / स्वयं को क्रियान्वित बंद आम तौर पर गुंजाइश संपुटित करने के लिए इतना है कि केवल दिए गए मान इसके बाहर पहुँचा जा सकता है प्रयोग किया जाता है। (या कुछ भी आप अन्य वस्तुओं के लिए देते हैं, खिड़की की तरह)

02/10/2012 को 15:31
का स्रोत उपयोगकर्ता

वोट
1

गुमनाम समारोह शायद वहाँ कोड के अन्य भागों के साथ नाम collition को रोकने के लिए है। इस तरह से यह के बारे में सोचो, अपने गुमनाम समारोह के अंदर, तुम भी एक चर "$" कहा जाता है आप जो कुछ भी चाहते हैं होने के लिए घोषित कर सकता है, और एक ही समय में, संघर्ष के बिना अपने कोड के अन्य भागों पर jQuery का उपयोग किया।

02/10/2012 को 15:31
का स्रोत उपयोगकर्ता

वोट
-4

बंद एकमात्र मतलब मानकों के साथ कंस्ट्रक्टर कॉल करने के लिए है:

var w = new Greeter("hello")

वहाँ अन्य तरीके हैं, लेकिन सभी जटिल और सीमाएं और कमियां के साथ।

18/07/2014 को 09:13
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more