ক্লোজার থেকে একটি নিষ্কাশন অনুসরণ করে : মাইকেল বোলিনের সংজ্ঞা নির্দেশিকা । এটি কিছুটা লম্বা দেখায় তবে এটি প্রচুর অন্তর্দৃষ্টি দিয়ে স্যাচুরেটেড। "পরিশিষ্ট বি। প্রায়শই ভুল বোঝে জাভাস্ক্রিপ্ট ধারণা" থেকে:
this
কোনও ফাংশন বলা হলে কী বোঝায়
ফর্মটির কোনও ক্রিয়াকলাপ কল করার সময় foo.bar.baz()
, অবজেক্টটিকে foo.bar
রিসিভার হিসাবে উল্লেখ করা হয়। যখন ফাংশনটি ডাকা হয়, এটি সেই রিসিভার যা এর মান হিসাবে ব্যবহৃত হয় this
:
var obj = {};
obj.value = 10;
/** @param {...number} additionalValues */
obj.addValues = function(additionalValues) {
for (var i = 0; i < arguments.length; i++) {
this.value += arguments[i];
}
return this.value;
};
// Evaluates to 30 because obj is used as the value for 'this' when
// obj.addValues() is called, so obj.value becomes 10 + 20.
obj.addValues(20);
যদি কোনও ফাংশন ডাকা হয় তখন কোনও স্পষ্টরূপে গ্রহণযোগ্য হয় না, তবে গ্লোবাল অবজেক্টটি রিসিভার হয়ে যায়। পৃষ্ঠা 47-তে "goog.global" তে বর্ণিত হিসাবে, জাভাস্ক্রিপ্ট যখন কোনও ওয়েব ব্রাউজারে কার্যকর করা হয় তখন উইন্ডোটি বিশ্বব্যাপী অবজেক্ট। এটি কিছু অবাক করা আচরণের দিকে পরিচালিত করে:
var f = obj.addValues;
// Evaluates to NaN because window is used as the value for 'this' when
// f() is called. Because and window.value is undefined, adding a number to
// it results in NaN.
f(20);
// This also has the unintentional side effect of adding a value to window:
alert(window.value); // Alerts NaN
যদিও obj.addValues
এবং f
একই ফাংশনটি উল্লেখ করে, ডাকা হলে তারা ভিন্ন আচরণ করে কারণ প্রতিটি কলটিতে রিসিভারের মান আলাদা। এই কারণে, কোনও ফাংশনকে বোঝায় যখন কল করা হয় this
, this
যখন এটি আহ্বান করা হয় তখন এটির সঠিক মান হবে তা নিশ্চিত করা গুরুত্বপূর্ণ । স্পষ্টতই, যদি this
ফাংশন বডিটিতে রেফারেন্স না দেওয়া হয় তবে তার আচরণ f(20)
এবং obj.addValues(20)
একই রকম হবে।
যেহেতু ফাংশনগুলি জাভাস্ক্রিপ্টে প্রথম শ্রেণীর অবজেক্ট, সেগুলির নিজস্ব পদ্ধতি থাকতে পারে। সমস্ত ফাংশনগুলির পদ্ধতি রয়েছে call()
এবং apply()
যা this
ফাংশনটি কল করার সময় রিসিভারকে পুনরায় সংজ্ঞা দেওয়া সম্ভব করে (অর্থাত, বস্তু যা বোঝায়)। পদ্ধতিটির স্বাক্ষরগুলি নিম্নরূপ:
/**
* @param {*=} receiver to substitute for 'this'
* @param {...} parameters to use as arguments to the function
*/
Function.prototype.call;
/**
* @param {*=} receiver to substitute for 'this'
* @param {Array} parameters to use as arguments to the function
*/
Function.prototype.apply;
নোট যে শুধুমাত্র মধ্যে পার্থক্য call()
এবং apply()
যে call()
ব্যক্তি আর্গুমেন্ট হিসাবে ফাংশন পরামিতি গ্রহণ করে, যেহেতু apply()
তাদের একটি একক অ্যারে হিসাবে গ্রহণ করে:
// When f is called with obj as its receiver, it behaves the same as calling
// obj.addValues(). Both of the following increase obj.value by 60:
f.call(obj, 10, 20, 30);
f.apply(obj, [10, 20, 30]);
নিম্নলিখিত কল, হয় সমতুল্য f
এবং obj.addValues
একই ফাংশন উল্লেখ করুন:
obj.addValues.call(obj, 10, 20, 30);
obj.addValues.apply(obj, [10, 20, 30]);
যাইহোক, যেহেতু এটির নির্দিষ্ট করা না হয়ে রিসিভার আর্গুমেন্টের বিকল্প হিসাবে তার নিজের গ্রাহকের মান call()
বা apply()
ব্যবহার করে না , নিম্নলিখিতগুলি কাজ করবে না:
// Both statements evaluate to NaN
obj.addValues.call(undefined, 10, 20, 30);
obj.addValues.apply(undefined, [10, 20, 30]);
মান this
করতে পারেন হতে null
বা undefined
একটি ফাংশন বলা হয় না। যখন null
বা undefined
রিসিভার হিসাবে সরবরাহ করা হয় call()
বা apply()
, গ্লোবাল অবজেক্ট পরিবর্তে রিসিভার জন্য মান হিসেবে ব্যবহৃত হয়। অতএব, পূর্ববর্তী কোডটিতে value
বৈশ্বিক অবজেক্টে নাম যুক্ত সম্পত্তি যুক্ত করার একই অনাকাঙ্ক্ষিত পার্শ্ব প্রতিক্রিয়া রয়েছে ।
কোনও ফাংশনটি ভেরিয়েবলটি নির্ধারণ করা হয়েছে তার জ্ঞান না থাকা হিসাবে এটি ভাবতে সহায়ক হতে পারে। এটি এই ধারণাটিকে শক্তিশালী করতে সহায়তা করে যে ফাংশনটি যখন এটি সংজ্ঞায়িত করার পরিবর্তে বলা হয় তখন এর মান আবদ্ধ হবে।
নিষ্কাশনের সমাপ্তি।
a
আরোগুলির অ্যারের জন্য এবংc
কলের কলামগুলির জন্য কল করার জন্য আবেদন করার কথা ভাবুন ।