कोष्ठक के बिना एक फ़ंक्शन को कॉल करने के कई अलग-अलग तरीके हैं।
मान लें कि आपके पास यह फ़ंक्शन परिभाषित है:
function greet() {
console.log('hello');
}
फिर यहां greetबिना कोष्ठकों के कॉल करने के कुछ तरीके दिए गए हैं:
1. कंस्ट्रक्टर के रूप में
साथ newआप कोष्ठकों के बिना एक समारोह आह्वान कर सकते हैं:
new greet; // parentheses are optional in this construct.
से पर MDN newoprator :
वाक्य - विन्यास
new constructor[([arguments])]
2. के रूप में toStringया valueOfकार्यान्वयन
toStringऔर valueOfविशेष विधियाँ हैं: जब रूपांतरण आवश्यक होता है, तो वे अंतर्निहित रूप से कहलाते हैं:
var obj = {
toString: function() {
return 'hello';
}
}
'' + obj; // concatenation forces cast to string and call to toString.
आप इस पैटर्न का उपयोग greetबिना कोष्ठक के कॉल करने के लिए कर सकते हैं :
'' + { toString: greet };
या साथ valueOf:
+{ valueOf: greet };
valueOfऔर toStringवास्तव में @@Primitive विधि (ES6 के बाद से) से बुलाया जाता है , और इसलिए आप उस विधि को भी लागू कर सकते हैं :
+{ [Symbol.toPrimitive]: greet }
"" + { [Symbol.toPrimitive]: greet }
valueOfसमारोह समारोह में 2. बी ओवरराइडिंग
आप प्रोटोटाइपvalueOf पर विधि को ओवरराइड करने के लिए पिछला विचार ले सकते हैं :Function
Function.prototype.valueOf = function() {
this.call(this);
// Optional improvement: avoid `NaN` issues when used in expressions.
return 0;
};
एक बार जब आप ऐसा कर लेते हैं, तो आप लिख सकते हैं:
+greet;
और यद्यपि वहाँ कोष्ठक रेखा से नीचे हैं, वास्तविक ट्रिगर आमंत्रण में कोई कोष्ठक नहीं हैं। इस बारे में ब्लॉग में देखें "वास्तव में उन्हें बुलाए बिना, जावास्क्रिप्ट में कॉलिंग के तरीके"
3. जनरेटर के रूप में
आप एक जनरेटर फ़ंक्शन (साथ *) को परिभाषित कर सकते हैं , जो एक पुनरावृत्ति देता है । आप इसे प्रसार सिंटैक्स का उपयोग करके या सिंटैक्स के साथ कह सकते हैं for...of।
पहले हमें मूल greetफ़ंक्शन के जनरेटर संस्करण की आवश्यकता है :
function* greet_gen() {
console.log('hello');
}
और फिर हम @@ पुनरावृत्ति विधि को परिभाषित करके कोष्ठक के बिना कहते हैं :
[...{ [Symbol.iterator]: greet_gen }];
आम तौर पर जनरेटर में एक yieldकीवर्ड होता है, लेकिन फ़ंक्शन को कॉल करने के लिए इसकी आवश्यकता नहीं होती है।
अंतिम विवरण समारोह को आमंत्रित करता है, लेकिन यह विनाशकारी भी हो सकता है :
[,] = { [Symbol.iterator]: greet_gen };
या एक for ... ofनिर्माण, लेकिन इसमें स्वयं के कोष्ठक हैं:
for ({} of { [Symbol.iterator]: greet_gen });
ध्यान दें कि आप उपरोक्त मूल कार्य के साथ भी कर सकते हैं greet, लेकिन इसे निष्पादित करने के बाद greet (एफएफ और क्रोम पर परीक्षण किया गया है) एक अपवाद को ट्रिगर करेगा । आप एक try...catchब्लॉक के साथ अपवाद का प्रबंधन कर सकते हैं ।
4. गेट्टर के रूप में
@ jehna1 का इस पर पूरा जवाब है, इसलिए उसे श्रेय दें। यहाँ एक विधि कोष्ठकों को कम करने का एक तरीका है , जो वैश्विक दायरे में कम है , पदावनत__defineGetter__ पद्धति से बचना । इसके Object.definePropertyबजाय उपयोग करता है ।
हमें इसके लिए मूल greetफ़ंक्शन का एक संस्करण बनाने की आवश्यकता है :
Object.defineProperty(window, 'greet_get', { get: greet });
और तब:
greet_get;
windowआपकी वैश्विक वस्तु जो भी है उसे प्रतिस्थापित करें।
आप greetइस तरह से वैश्विक वस्तु पर एक निशान छोड़ने के बिना मूल कार्य कह सकते हैं :
Object.defineProperty({}, 'greet', { get: greet }).greet;
लेकिन कोई यह तर्क दे सकता है कि हमारे यहाँ कोष्ठक हैं (हालाँकि वे वास्तविक आह्वान में शामिल नहीं हैं)।
5. टैग फ़ंक्शन के रूप में
ES6 के बाद से आप इसे इस वाक्य रचना के साथ एक टेम्पलेट शाब्दिक पासिंग फ़ंक्शन कह सकते हैं :
greet``;
"टैग किए गए टेम्पलेट साहित्य" देखें ।
6. प्रॉक्सी हैंडलर के रूप में
ES6 के बाद से, आप एक प्रॉक्सी को परिभाषित कर सकते हैं :
var proxy = new Proxy({}, { get: greet } );
और फिर किसी भी संपत्ति के मूल्य को पढ़ना होगा greet:
proxy._; // even if property not defined, it still triggers greet
इसके कई रूप हैं। एक और उदाहरण:
var proxy = new Proxy({}, { has: greet } );
1 in proxy; // triggers greet
7. उदाहरण चेकर के रूप में
instanceofऑपरेटर को निष्पादित करता है @@hasInstanceजब परिभाषित दूसरे संकार्य, पर विधि:
1 instanceof { [Symbol.hasInstance]: greet } // triggers greet