বন্ধনী ছাড়াই একটি ফাংশন কল করার বিভিন্ন উপায় রয়েছে।
ধরে নেওয়া যাক আপনার এই ফাংশনটি সংজ্ঞায়িত হয়েছে:
function greet() {
console.log('hello');
}
তারপরে এখানে প্রথম greetবন্ধনী ছাড়াই কল করার কিছু উপায় অনুসরণ করুন :
1. কনস্ট্রাক্টর হিসাবে
newআপনি প্রথম বন্ধনী ছাড়াই একটি ফাংশন শুরু করতে পারেন:
new greet; // parentheses are optional in this construct.
অপারেটরটিতে এমডিএনnew থেকে :
বাক্য গঠন
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প্রকৃতপক্ষে @@ টু প্রিমিটিভ পদ্ধতি থেকে (ES6) থেকে ডেকে আনা হয় এবং আপনি সেই পদ্ধতিটি প্রয়োগ করতে পারেন :
+{ [Symbol.toPrimitive]: greet }
"" + { [Symbol.toPrimitive]: greet }
2. বি valueOfফাংশন প্রোটোটাইপ ওভাররাইডিং
প্রোটোটাইপটিতে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অপারেটর executes @@hasInstanceযখন সংজ্ঞায়িত দ্বিতীয় প্রতীক, উপর পদ্ধতি:
1 instanceof { [Symbol.hasInstance]: greet } // triggers greet