কঠোর ব্যবহারের সময় কেন একটি অনামী কর্মে "এটি" অপরিজ্ঞাত হয়?


86

কেন এই একটি বেনামী ফাংশনে undefined যখন কঠোর মোডে জাভাস্ক্রিপ্ট ব্যবহার করছেন? আমি বুঝতে পেরেছি কেন এটি বোধগম্য হতে পারে তবে আমি এর কোনও ठोस উত্তর পাই না।

উদাহরণ:

(function () {
    "use strict";

    this.foo = "bar"; // *this* is undefined, why?
}());

একটি ভাড়ায় পরীক্ষা করুন : http://jsfiddle.net/Pyr5g/1/ লগার (ফায়ারব্যাগ) পরীক্ষা করে দেখুন।


4
দ্রষ্টব্য যে এটি বেনামে ফাংশনগুলির সাথে কিছুই করার নয়, তবে আহবান পদ্ধতি। দেখুন এই পরিবর্তিত বেহালার (কনসোল লগ মধ্যে চেহারা)।
ফ্রোগজ

@ ফ্রোগজ: এখান থেকেই কিছু বিভ্রান্তি এসেছে। যে ইশারা জন্য ধন্যবাদ।
টি। জাংঘনস

উত্তর:


102

এটি কারণ, ECMAscript 262 সংস্করণ 5 অবধি, একটি বড় বিভ্রান্তি ছিল যদি লোকেরা যেখানে ব্যবহার করে constructor pattern, newকীওয়ার্ডটি ব্যবহার করতে ভুলে যায় । আপনি যদি newES3 তে কনস্ট্রাক্টর ফাংশনটি কল করার জন্য ব্যবহার করতে ভুলে গিয়েছিলেন , thisতবে বৈশ্বিক অবজেক্টটি ( windowব্রাউজারে) উল্লেখ করা হয় এবং আপনি বৈশ্বিক অবজেক্টটিকে ভেরিয়েবলগুলি দিয়ে ক্লোবার করবেন।

এটি ছিল ভয়াবহ আচরণ এবং তাই ইসিএমএর লোকেরা ঠিক করেছে, সেট thisকরার সিদ্ধান্ত নিয়েছে undefined

উদাহরণ:

function myConstructor() {
    this.a = 'foo';
    this.b = 'bar';
}

myInstance     = new myConstructor(); // all cool, all fine. a and b were created in a new local object
myBadInstance  = myConstructor(); // oh my gosh, we just created a, and b on the window object

শেষ লাইনটি ES5- তে কঠোরভাবে ত্রুটি ফেলবে

"TypeError: this is undefined"

(যা অনেক ভাল আচরণ)


4
এইবার বুঝতে পারছি. আপনার কাছে কি বিবৃতি ব্যাক আপ করার একটি রেফারেন্স আছে?
রব ডব্লু

4
টুইটার
jAndy

4
এটি জাভাস্ক্রিপ্টে উল্লেখ করা হয়েছে: দ্য গুড পার্টস বাই ক্রোকফোর্ড। এটি বিস্তারিতভাবে বর্ণনা করা হয়েছে। যদিও ইসিএমএ সিদ্ধান্ত সম্পর্কে নয়।
মাদ্রি

4
কেন কঠোর মোড এটিকে অপরিজ্ঞায়িত করতে ডিফল্ট করে তোলার যৌক্তিক কারণ। অন্যান্য যৌক্তিক কারণটি দক্ষতা, অন্য যৌক্তিক কারণ this === windowহ'ল বিভ্রান্তিকর এবং গ্লোবাল
স্কোপকে

4
@ জে অ্যান্ডি: উত্তরের জন্য ধন্যবাদ। এইবার বুঝতে পারছি. আমিও পরিবর্তনের একটি কম্প্যাক্ট ব্যাখ্যা পাওয়া এই উপর javascriptweblog.wordpress.com/2011/05/03/... : "মধ্যে সবচেয়ে উল্লেখযোগ্য হল যদি প্রথম আর্গুমেন্ট কল বা আবেদন করতে ফাঁকা বা অনির্দিষ্ট, এই প্রার্থনা ফাংশনের মান হয় গ্লোবাল অবজেক্টে রূপান্তরিত হবে না। "
টি। জাংঘনস

15

"বক্সিং" নামক একটি প্রক্রিয়া রয়েছে যা thisডাকা ফাংশনটির প্রসঙ্গে প্রবেশের আগে অবজেক্টটিকে মোড়ানো বা পরিবর্তন করে । আপনার ক্ষেত্রে, এর মান হওয়া thisউচিত undefinedকারণ আপনি কোনও অবজেক্টের পদ্ধতি হিসাবে ফাংশনটি কল করছেন না। যদি কঠোর মোড না হয়, এই ক্ষেত্রে, এটি windowবস্তুর দ্বারা প্রতিস্থাপন করা হবে । ইন strictমোড এটা সবসময় অপরিবর্তিত হয়ে গেলো, অথচ এটা যে undefinedএখানে।

আপনি https://developer.mozilla.org/en/ জাভা স্ক্রিপ্ট / স্ট্রাইক_মোডে আরও তথ্য পেতে পারেন


@ সামুয়েল তাই কীভাবে আমরা উইন্ডো অবজেক্টকে কড়া মোডে ভেরিয়েবল নির্ধারণ করতে পারি ??
নুল পয়েন্টার

8

এই স্ট্যাক ওভারফ্লো উত্তর অনুসারে , আপনি thisঅনামী ফাংশনগুলির ভিতরে কেবল .call(this)এর শেষে কল করেই ব্যবহার করতে পারেন ।

(function () {
    "use strict";

    this.foo = "bar";
}).call(this);

4
নোট যে এই ক্ষেত্রে অবজেক্ট thisহবে Window, যা পছন্দসই হতে পারে না
নিনজাকানন

এই উত্তরটি জিজ্ঞাসিত প্রশ্নের ব্যাখ্যা দেয় না।
আনভেশ চেকা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.