ইসিএমএ 5 এর রেফারেন্সটি স্পষ্ট করা দরকার।
আমি ধরে নিলাম এর ECMA-262 সংস্করণটির অর্থ 5. এটি উল্লেখ্য হওয়া উচিত যে ইসিএমএ-262 (ওরফে ইসসিএমএসক্রিপ্ট বা কম, জাভাস্ক্রিপ্ট) একটি সাধারণ স্ক্রিপ্টিং ভাষা যা ইন্টারনেট ব্রাউজারগুলিতে প্রয়োগ করা হয়েছে । সংস্করণ 5.1 স্ট্যান্ডার্ড থেকে:
নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করা হয় যখন কন্ট্রোল ফাংশন অবজেক্ট এফ তে থাকা ফাংশন কোডের জন্য সম্পাদনা প্রসঙ্গে প্রবেশ করে, একজন কলার এইআরজি সরবরাহ করেছেন এবং কলার সরবরাহকারী আর্গুমেন্ট তালিকা:
- যদি ফাংশন কোডটি কঠোর কোড হয় তবে এটিটিকে এইআরজিতে সেট করুন।
- অন্যথায় যদি এইআর্গটি নাল বা অপরিজ্ঞাত হয় তবে এটি বিশ্বব্যাপী অবজেক্টে এই বাইন্ডিংটি সেট করুন।
- অন্যথায় যদি প্রকার (thisArg) অবজেক্ট না হয় তবে এই বাইন্ডিংটিকে টোঅবজেক্ট (thisArg) এ সেট করুন।
- অন্যটি এইআরসকে এই বাঁধাই সেট করে
- ... ("এটি" সম্পর্কে নয়)
"গ্লোবাল অবজেক্ট" শব্দটি স্কোপ চেইনের শীর্ষে থাকা যেকোন বস্তুকে বোঝায়। ব্রাউজারগুলির জন্য এটি "উইন্ডো" অবজেক্ট হবে তবে এটি একটি বাস্তবায়ন পছন্দ (উইন্ডোজ স্ক্রিপ্ট হোস্টের একটি অদৃশ্য বৈশ্বিক অবজেক্ট রয়েছে তবে কোনও কঠোর মোড নেই তাই অযোগ্য উল্লেখগুলি এর বৈশিষ্ট্যগুলিতে অ্যাক্সেস করে এবং কোনও বিশ্বব্যাপী "স্ব" নেই)। এছাড়াও, "কঠোর মোড" অবশ্যই স্পষ্টভাবে সক্ষম করতে হবে অন্যথায় এটি সক্রিয় নয় (স্ট্যান্ডার্ডের 14.1 ধারা)। এর মতো, একটি অনির্ধারিত "এটি" এখনও কঠোর মোডটি সক্রিয় না করে "ইসিএমএ 5" তে গ্লোবাল অবজেক্ট (উইন্ডো) এ সমাধান করবে।
সুতরাং প্রশ্নের উত্তরটি হ'ল:
"এটি" সর্বদা ফাংশনটিকে অনুরোধ করা অবজেক্টকে বোঝায়। যদি ফাংশনটি কোনও বস্তুর দ্বারা না ডাকা হয় (যেমন কোনও পদ্ধতি কল নয়) তবে "এটি" (ফাংশনটিতে পাঠানো হিসাবে) "অপরিজ্ঞাত"। তবে, যদি কঠোর মোড ব্যবহার না করা হয় তবে একটি অপরিজ্ঞাত "এটি" বিশ্বব্যাপী অবজেক্টে সেট করা আছে (উপরের নিয়ম 2)।
"স্ব" এর কোনও বিশেষ সিনট্যাকটিক অর্থ নেই, এটি কেবল একটি সনাক্তকারী। ব্রাউজারগুলি উইন্ডো.সাইফ (বিশ্বব্যাপী উইন্ডো অবজেক্টের কেবলমাত্র একটি সম্পত্তি) = উইন্ডো সংজ্ঞায়িত করে। "স্ব" এর সাথে "উইন্ডো" UNLESS "স্ব" এর সমতুল্য হওয়ার অযোগ্য উল্লেখগুলির ফলাফলগুলির ফলে একটি ঘেরের সুযোগের মধ্যে পুনরায় সংজ্ঞায়িত করা হয়েছে (যেমন উপরে "var স্ব = এটি;" উপরে Good শুভেচ্ছা "এটি" পুনরায় সংজ্ঞায়িত করে))
সুতরাং উপরের উদাহরণটির সম্পূর্ণ ব্যাখ্যা হ'ল:
outer func: this.foo = bar
// "this" refers to the invoking object "myObject"
outer func: self.foo = bar
// "self" resolves to the variable in the local scope which has been set to "this" so it is also "myObject"
inner func: this.foo = undefined
// "this" refers to the invoking object (none) and so is replaced by the global object (strict mode must be off). "window" has no foo property so its "value" is undefined.
inner func: self.foo = bar
// self resolves to the variable in the enclosing scope which is still "myObject"
উদাহরণের একটি আকর্ষণীয় প্রকরণটি অভ্যন্তরীণ ফাংশনটির একটি রেফারেন্স ফিরিয়ে একটি ক্লোজার তৈরি করে।
var myObject = {
foo: "bar",
func: function() {
var self = this;
console.log("outer func: this.foo = " + this.foo);
console.log("outer func: self.foo = " + self.foo);
return function() {
console.log("inner func: this.foo = " + this.foo);
console.log("inner func: self.foo = " + self.foo);
};
}
};
var yourObject = {
foo: "blat",
func: myObject.func() // function call not function object
};
console.log("----");
yourObject.func();
আবহ
outer func: this.foo = bar
outer func: self.foo = bar
----
inner func: this.foo = blat
inner func: self.foo = bar
আপনার অবজেক্ট দ্বারা চালিত না হওয়া পর্যন্ত অভ্যন্তরীণ ফাংশনটি কীভাবে ডাকা হবে না তা নোট করুন। সুতরাং এটি.ফু এখন আপনারঅবজেক্ট.ফু তবে স্ব এখনও আবদ্ধ স্কোপটিতে পরিবর্তনশীলটির সাথে সংশোধন করে, যা অভ্যন্তরীণ ফাংশনটি প্রত্যাবর্তনের সময়, (এবং ফলস্বরূপ বন্ধে এখনও মাইওজেক্ট) ছিল। সুতরাং, অভ্যন্তরীণ ফাংশনের মধ্যে, "এটি" আভ্যন্তরীণ ফাংশনকে ডেকে আনা বস্তুকে বোঝায় যখন "স্ব" সেই বস্তুকে বোঝায় যা অভ্যন্তরীণ ফাংশনের রেফারেন্স তৈরি করতে বাহ্যিক ফাংশন বলে called
সংক্ষিপ্তসার সংক্ষিপ্তসার হিসাবে, "এটি" ভাষা মান দ্বারা সংজ্ঞায়িত করা হয়, "স্ব" সংজ্ঞায়িত হয় যিনি এটি সংজ্ঞায়িত করেন (রানটাইম প্রয়োগকারী বা শেষ প্রোগ্রামার)।