কোনও ফাংশনের `এটি` কীওয়ার্ডের মান একজন গেটর থেকে ফিরে আসে


15

আমি নীচের উদাহরণে এই কীওয়ার্ডটির একটি অপ্রত্যাশিত মান পেয়েছি :

let x = {
    z : 10 ,
    get func1() {
        return function(v) {
            console.log(this === v);
        }
    }
}


x.func1(x)

এই কীওয়ার্ডটির মান হ'ল অবজেক্ট এক্স , যেন এটি that অবজেক্ট থেকে নির্বাহ করা হয়, আমি কেবলমাত্র এই গেম ফাংশনটির প্রত্যাশা করি যা এই কীওয়ার্ডটি কলিং অবজেক্ট x এর সমান

এই উদাহরণ আমাদের পার্থক্য দেখায়

let x = {
    func2() {
        return function(v) {
            console.log(this === v);
        }
    }
}

x.func2()(x);

উভয় উদাহরণে ফানক 1 যা গেটর ফাংশন, এবং ফানক 2 যা বস্তুর একটি পদ্ধতি, অবজেক্ট এক্স থেকে নির্বাহ করা হয় এবং ফিরে ফাংশনটি সম্পাদন করা হয়। সুতরাং কেন প্রথম উদাহরণে এই মানটি x এর পরিবর্তে বিশ্বব্যাপী বস্তুর সমান নয় ।


3
সত্যিই, সত্যিই আকর্ষণীয় প্রশ্ন। আমি আগে কখনও এই বলি ছিল না।
টিজে ক্রাউডার

1
" যেমন যদি এটা যে বস্তু থেকে মৃত্যুদন্ড কার্যকর হচ্ছে " - কিন্তু এটা করা হয় যে বস্তুর উপর মৃত্যুদন্ড কার্যকর করা, ঠিক আছে: x.func1()
বার্গি

উত্তর:


13

এটি একটি খুব আকর্ষণীয় প্রশ্ন।

কারণ কোনও সম্পত্তি অ্যাক্সেসের ফলাফলের সাথে সাথে ফাংশনটি তত্ক্ষণাত ডাকা হচ্ছে। সুতরাং এগুলি মূলত সমতুল্য:

let x = {
    get func1() {
        return function(v) {
            console.log(this === v);
        };
    },
    func2(v) {
        console.log(this === v);
    }
};

x.func1(x);
x.func2(x);

উভয় ক্ষেত্রেই:

  1. সম্পত্তির মান পড়া হয়, যার ফলে কোনও ফাংশন রেফারেন্স হয়।
  2. সেই বৈশিষ্ট্যটি একই সম্পত্তি অ্যাক্সেস এক্সপ্রেশনের অংশ হিসাবে কার্যকর করা হয়।

সত্য যে func1একটি অ্যাকসেসর প্রপার্টিতে এবং func2একটি ডাটা সম্পত্তি কোন ব্যাপার না। সম্পত্তি পড়ার ফলে প্রাপ্ত মানটি কীভাবে গুরুত্বপূর্ণ তা ব্যবহৃত হয়।


1
আমি ভেবেছিলাম পুরো ক্রিয়াটি ফাংশন অবজেক্টে মূল্যায়ন করা হবে এবং তারপরে মৃত্যুদন্ড কার্যকর করা হবে। ধন্যবাদ এটি পেয়েছে
কিরোল্লো নসর

1
@ কিরল্লোস নাসর হ্যাঁ, তবে এটি প্রকাশের ক্ষেত্রে x.func1এটি xপরবর্তী কলের প্রসঙ্গ হিসাবে রেফারেন্স রাখে , এর বিপরীতে x.func2()(আপনার প্রশ্ন থেকে) যা কোনও ফাংশনকেও মূল্যায়ন করে তবে কোনও সদস্য অ্যাক্সেস এক্সপ্রেশন নয়।
বার্গি

1
@ বেরগি - আমার মনে হয় আপনি বোঝাতে চেয়েছেন x.func2()(x);?
টিজে ক্রাউডার

1
@ টিজে ক্রাউডার হ্যাঁ, আমি ভিতরে প্রকাশগুলি x.func1(x)এবং উল্লেখ করেছিx.func2()(x)
বার্গি

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