"এই" কীওয়ার্ডটি কীভাবে কাজ করে?


1308

আমি লক্ষ্য করেছি যে thisস্ট্যাক ওভারফ্লো সাইটে জাভাস্ক্রিপ্টে কীওয়ার্ডটি কী এবং কীভাবে এটি সঠিকভাবে (এবং ভুলভাবে) ব্যবহৃত হয়েছে তার স্পষ্ট ব্যাখ্যা পাওয়া যায় না ।

আমি এটির সাথে কিছু খুব অদ্ভুত আচরণ প্রত্যক্ষ করেছি এবং এটি কেন ঘটেছে তা বুঝতে ব্যর্থ হয়েছি।

কীভাবে thisকাজ করে এবং কখন এটি ব্যবহার করা উচিত?




2
পিটার Michaux ব্যবহার করার বিরুদ্ধে পক্ষপাতী this peter.michaux.ca/articles/javascript-widgets-without-this
মার্সেল Korpel

1
এমডিএন ওভারভিউ অর্ধ-খারাপ নয় ... ডেভেলপার.মোজিলা.আর.ইন.ইউ
ডকস

2
মূলশব্দটির একটি আকর্ষণীয় ব্যাখ্যা this: রেনসওফট.আইও
দিমিত্রি পাভলুটিন

উত্তর:


1349

আমি প্রথমে জাভাস্ক্রিপ্টে ( মিরর ) মাইক ওয়েস্টের নিবন্ধটি পড়ার প্রস্তাব দিই । এটি জাভাস্ক্রিপ্টে ধারণাগুলি এবং স্কোপ চেইনের একটি দুর্দান্ত, বন্ধুত্বপূর্ণ ভূমিকা ।this

একবার আপনি অভ্যস্ত হতে শুরু করলে this, নিয়মগুলি আসলে বেশ সহজ। এর নাম ECMAScript 5.1 স্ট্যান্ডার্ড সংজ্ঞায়িত this:

.111.1.1 মূল thisশব্দটি

thisবর্তমান সঞ্চালনের প্রসঙ্গের ThisBinding মূল্য শব্দ মূল্যায়ণ

এটি জাভা স্ক্রিপ্ট ইন্টারপ্রেটার এমন একটি বিষয় যা এটি জাভাস্ক্রিপ্ট কোডকে মূল্যায়ন করার সাথে সাথে বজায় রাখে, যেমন একটি বিশেষ সিপিইউ রেজিস্ট্রারের মতো যা কোনও সামগ্রীর রেফারেন্স ধারণ করে। দোভাষী অনুবাদক এই বাঁধাই আপডেট করে যখনই কেবলমাত্র তিনটি ভিন্ন ক্ষেত্রে একটিতে প্রয়োগের প্রসঙ্গ স্থাপন করে:

1. প্রাথমিক গ্লোবাল এক্সিকিউশন প্রসঙ্গ

এটি জাভাস্ক্রিপ্ট কোডের ক্ষেত্রে যা শীর্ষ-স্তরে মূল্যায়ন করা হয়, উদাহরণস্বরূপ যখন সরাসরি কোনও এর ভিতরে থাকে <script>:

<script>
  alert("I'm evaluated in the initial global execution context!");

  setTimeout(function () {
      alert("I'm NOT evaluated in the initial global execution context.");
  }, 1);
</script>

প্রাথমিক গ্লোবাল এক্সিকিউশন প্রসঙ্গে কোড মূল্যায়ন করার সময়, এই বাইন্ডিংটি বিশ্বব্যাপী অবজেক্টে সেট করা থাকে window( §10.4.1.1 )।

ইভাল কোড প্রবেশ করানো হচ্ছে

  • … এই eval() বাঁধে সরাসরি কল করে অপরিবর্তিত রেখে দেওয়া হয়েছে; এটি কলিং এক্সিকিউশন কনটেক্সট ( §10.4.2 (2) (ক)) এর এই বাইন্ডিংয়ের সমান মান ।

  • … যদি না এই সরাসরি eval()
    বাঁধার মাধ্যমে এটি বৈশ্বিক অবজেক্টে সেট করা হয় যেমন প্রাথমিক গ্লোবাল এক্সিকিউশন প্রসঙ্গে ( .410.4.2 (1)) কার্যকর করা হয়।

§15.1.2.1.1 ডাইরেক্ট কলটি কী তা নির্ধারণ করে eval()। মূলত, eval(...)একটি সরাসরি কল যেখানে কিছু (0, eval)(...)বা এর মতো var indirectEval = eval; indirectEval(...);পরোক্ষ কল eval()। দেখুন chuckj এর উত্তর থেকে জাভাস্ক্রিপ্ট মধ্যে Eval ( 'এই') বনাম (1, Eval) ( 'এই')? এবং দিমিত্রি সোশনিকভের ECMA-262-5 বিস্তারিত। অধ্যায় 2. কড়া মোড। কারণ আপনি যখন পরোক্ষ eval()কল ব্যবহার করতে পারেন ।

ফাংশন কোড প্রবেশ করানো হচ্ছে

কোনও ফাংশন কল করার সময় এটি ঘটে। যদি কোনও ফাংশন কোনও অবজেক্টে ডাকা হয় যেমন যেমন obj.myMethod()বা তার সমতুল্য obj["myMethod"](), তবে এই বাঁধাইটি বস্তুতে সেট করা হয় ( objউদাহরণস্বরূপ; §13.2.1 )। অন্যান্য ক্ষেত্রে, এই বাইন্ডিংটি বিশ্বব্যাপী অবজেক্টে ( §10.4.3 ) সেট করা আছে ।

"অন্যান্য ক্ষেত্রে" লেখার কারণ হ'ল আটটি ECMAScript 5 বিল্ট-ইন ফাংশন রয়েছে যা এটিবাইন্ডিংকে আর্গুমেন্ট তালিকায় নির্দিষ্ট করার অনুমতি দেয়। এই বিশেষ ফাংশনগুলি একটি তথাকথিত thisArgলাগে যা ফাংশনটি কল করার সময় এই বাঁধাই হয়ে যায় ( §10.4.3 )।

এই বিশেষ অন্তর্নির্মিত ফাংশনগুলি হ'ল:

  • Function.prototype.apply( thisArg, argArray )
  • Function.prototype.call( thisArg [ , arg1 [ , arg2, ... ] ] )
  • Function.prototype.bind( thisArg [ , arg1 [ , arg2, ... ] ] )
  • Array.prototype.every( callbackfn [ , thisArg ] )
  • Array.prototype.some( callbackfn [ , thisArg ] )
  • Array.prototype.forEach( callbackfn [ , thisArg ] )
  • Array.prototype.map( callbackfn [ , thisArg ] )
  • Array.prototype.filter( callbackfn [ , thisArg ] )

Function.prototypeফাংশনগুলির ক্ষেত্রে , তাদের ফাংশন অবজেক্টে ডাকা হয়, তবে এটি ফাংশন অবজেক্টে এই বাইন্ডিংটি সেট করার পরিবর্তে, এই বাইন্ডিংটি সেট করা হয় thisArg

Array.prototypeফাংশনগুলির ক্ষেত্রে, callbackfnপ্রদত্তটিকে একটি কার্যনির্বাহী প্রসঙ্গে বলা হয় যেখানে thisArgসরবরাহ করা হলে এই বাঁধাই সেট করা আছে; অন্যথায়, বিশ্বব্যাপী অবজেক্টের কাছে।

সেগুলি সরল জাভাস্ক্রিপ্টের জন্য নিয়ম। আপনি যখন জাভাস্ক্রিপ্ট লাইব্রেরি (উদাহরণস্বরূপ jQuery) ব্যবহার শুরু করেন, আপনি খুঁজে পেতে পারেন যে নির্দিষ্ট লাইব্রেরি ফাংশনগুলি এর মানটিকে ম্যানিপুলেট করে this। এই জাভাস্ক্রিপ্ট লাইব্রেরির বিকাশকারীরা এটি করে কারণ এটি সর্বাধিক সাধারণ ব্যবহারের ক্ষেত্রে সমর্থন করে এবং গ্রন্থাগারের ব্যবহারকারীরা সাধারণত এই আচরণটি আরও সুবিধাজনক বলে মনে করেন। thisলাইব্রেরি ফাংশন উল্লেখ করে কলব্যাক ফাংশনগুলি পাস করার thisসময়, ফাংশনটি যখন ডাকা হয় তখন তার মান কী তা সম্পর্কে কোনও গ্যারান্টির জন্য আপনাকে ডকুমেন্টেশন উল্লেখ করতে হবে ।

আপনি হতাশ হয় তাহলে কিভাবে JavaScript লাইব্রেরি নিপূণভাবে ব্যবহার করেন এর মান this, পাঠাগার কেবল একটি গ্রহণ জাভাস্ক্রিপ্ট বিল্ট-ইন ফাংশন ব্যবহার করা হয় thisArg। আপনিও কলব্যাক ফাংশন গ্রহণ করে নিজের ফাংশনটি লিখতে পারেন এবং thisArg:

function doWork(callbackfn, thisArg) {
    //...
    if (callbackfn != null) callbackfn.call(thisArg);
}

একটি বিশেষ মামলা আছে যা আমি এখনও উল্লেখ করি নি। newঅপারেটরের মাধ্যমে কোনও নতুন অবজেক্ট তৈরি করার সময়, জাভাস্ক্রিপ্ট ইন্টারপ্রেটার একটি নতুন, খালি অবজেক্ট তৈরি করে, কিছু অভ্যন্তরীণ বৈশিষ্ট্য নির্ধারণ করে এবং তারপরে নতুন অবজেক্টে কনস্ট্রাক্টর ফাংশনটি কল করে। সুতরাং, যখন কোনও ফাংশনটিকে কনস্ট্রাক্টর প্রসঙ্গে ডাকা হয়, তখন thisঅনুবাদক তৈরি করা নতুন বস্তুর মান হয়:

function MyType() {
    this.someData = "a string";
}

var instance = new MyType();
// Kind of like the following, but there are more steps involved:
// var instance = {};
// MyType.call(instance);

তীর ফাংশন

তীর ফাংশন (ইসিএমএ 6 তে প্রবর্তিত) এর ক্ষেত্র পরিবর্তন করে this। বিদ্যমান ক্যানোনিকাল প্রশ্ন দেখুন, তীর ফাংশন বনাম ফাংশন ঘোষণা / এক্সপ্রেশন: এগুলি কি সমান / বিনিময়যোগ্য? আরও তথ্যের জন্য. তবে সংক্ষেপে:

তীর ফাংশনগুলির নিজস্ব this.... বাঁধাই নেই। পরিবর্তে, identif শনাক্তকারীদের অন্যান্য ভেরিয়েবলের মতো লেজিকাল স্কোপে সমাধান করা হয়। এর অর্থ যে একটি তীর ফাংশনের অভ্যন্তরে, this... পরিবেশনের মানগুলির জন্য (গুলি) উল্লেখ thisকরুন তীর ফাংশনটি সংজ্ঞায়িত হয়েছে।

শুধু মজাদার জন্য, কিছু উদাহরণ দিয়ে আপনার বোঝার পরীক্ষা করুন

উত্তরগুলি প্রকাশ করতে হালকা ধূসর বাক্সগুলির উপরে মাউস।

  1. thisচিহ্নিত রেখার মান কত ? কেন?

    window - চিহ্নিত রেখাটি প্রাথমিক গ্লোবাল এক্সিকিউশন প্রসঙ্গে মূল্যায়ন করা হয়।

    if (true) {
        // What is `this` here?
    }
    
  2. মৃত্যুদন্ড কার্যকর করা thisহলে চিহ্নিত লাইনের মান কত obj.staticFunction()? কেন?

    obj - যখন কোনও বস্তুতে কোনও ফাংশন কল করার সময়, এই বাইন্ডিংটি অবজেক্টে সেট করা থাকে।

    var obj = {
        someData: "a string"
    };
    
    function myFun() {
        return this // What is `this` here?
    }
    
    obj.staticFunction = myFun;
    
    console.log("this is window:", obj.staticFunction() == window);
    console.log("this is obj:", obj.staticFunction() == obj);
      

  3. thisচিহ্নিত রেখার মান কত ? কেন?

    window

    এই উদাহরণস্বরূপ, জাভাস্ক্রিপ্ট ইন্টারপ্রেটার ফাংশন কোড প্রবেশ করে, তবে myFun/ obj.myMethodকোনও অবজেক্টে কল করা হয়নি বলে, এই বাইন্ডিংটি সেট করা আছে window

    এটি পাইথনের থেকে পৃথক, যেখানে কোনও পদ্ধতিতে অ্যাক্সেস করা obj.myMethodএকটি সীমাবদ্ধ পদ্ধতি অবজেক্ট তৈরি করে ।

    var obj = {
        myMethod: function () {
            return this; // What is `this` here?
        }
    };
    var myFun = obj.myMethod;
    console.log("this is window:", myFun() == window);
    console.log("this is obj:", myFun() == obj);
      

  4. thisচিহ্নিত রেখার মান কত ? কেন?

    window

    এই এক কৌতুকময় ছিল। যখন ইভাল কোড মূল্যায়ন, thisহয় obj। যাইহোক, inভাল myFunকোডগুলিতে কোনও বস্তুর windowউপরে কল করা হয় না, সুতরাং এই বাঁধাই কলটির জন্য সেট করা আছে ।

    function myFun() {
        return this; // What is `this` here?
    }
    var obj = {
        myMethod: function () {
            eval("myFun()");
        }
    };
    
  5. thisচিহ্নিত রেখার মান কত ? কেন?

    obj

    লাইনটি myFun.call(obj);বিশেষ অন্তর্নির্মিত ফাংশনটিকে অনুরোধ করছে Function.prototype.call(), যা thisArgপ্রথম যুক্তি হিসাবে গ্রহণ করে।

    function myFun() {
        return this; // What is `this` here?
    }
    var obj = {
        someData: "a string"
    };
    console.log("this is window:", myFun.call(obj) == window);
    console.log("this is obj:", myFun.call(obj) == obj);
      


6
@ অলি: এগুলি ইসমাস্ক্রিপ্ট স্ট্যান্ডার্ড, ইসিএমএ -262 এর 5.1 সংস্করণের মধ্যে বিভাগগুলির উল্লেখ রয়েছে । আমি তাদের সরবরাহ করি যাতে আপনি চাইলে প্রযুক্তিগত বিশদগুলির জন্য স্ট্যান্ডার্ডটি পড়তে পারেন।
ড্যানিয়েল ট্রেবিয়েন

1
আমি মনে করি @ সুপার্টনস্কি # 2 সম্পর্কে সঠিক - যদি মাইফুন () কে বিশ্বব্যাপী সুযোগ থেকে ডাকা হয় এবং অবজেক্টের কোনও পদ্ধতি হিসাবে না দেখানো হয় তবে "এটি" গ্লোবাল অবজেক্ট হবে, সুতরাং প্রশ্নের বাক্যটি গুরুত্বপূর্ণ। বিটিডব্লিউ - এর মতো কোনও কিছুর উত্তর পেতে আমি সত্যিই মাউসওভারটি ব্যবহার করার ধারণাটি পছন্দ করি ।
ব্যবহারকারী 655489

2
তবে, jsfiddle.net/H4LYm/2 দেখায় যে setTimeoutউদাহরণটির একটি thisরয়েছে window(global)
কেভিন মেরেডিথ

2
পাইথন থেকে আগত একজন যখন তৃতীয় উদাহরণে
ঝাঁপিয়ে

1
এই উত্তরটি সম্ভবত ES2020 বাস্তবতার প্রতিবিম্বিত করতে আপডেট করা উচিত, এমনকি যদি পরিবর্তনগুলি কেবলমাত্র শব্দগত হয়।
বেন অ্যাস্টন

156

thisজাভাস্ক্রিপ্ট মধ্যে ভিন্নভাবে শব্দ আচরণ করবে অন্যান্য ভাষায় তুলনায়। অবজেক্ট ওরিয়েন্টেড ভাষায়, thisকীওয়ার্ডটি শ্রেণীর বর্তমান উদাহরণকে বোঝায়। জাভাস্ক্রিপ্টে মানটির thisফাংশন ( context.function()) এবং যেখানে এটি বলা হয় তার আহবান প্রসঙ্গে নির্ধারিত হয় ।

1. যখন বিশ্বব্যাপী প্রসঙ্গে ব্যবহৃত হয়

আপনি যখন thisবৈশ্বিক প্রসঙ্গে ব্যবহার করেন, এটি বিশ্বব্যাপী অবজেক্টে আবদ্ধ হয় ( windowব্রাউজারে)

document.write(this);  //[object Window]

আপনি যখন thisবৈশ্বিক প্রসঙ্গে সংজ্ঞায়িত কোনও ফাংশনের অভ্যন্তর ব্যবহার করেন তখন thisএখনও বিশ্বব্যাপী অবজেক্টের সাথে আবদ্ধ থাকে কারণ কার্যটি বিশ্বব্যাপী প্রসঙ্গে একটি পদ্ধতি তৈরি করা হয়।

function f1()
{
   return this;
}
document.write(f1());  //[object Window]

উপরে f1গ্লোবাল অবজেক্টের একটি পদ্ধতি তৈরি করা হয়েছে। সুতরাং আমরা এটি windowনিম্নলিখিত হিসাবে বস্তুতে কল করতে পারেন :

function f()
{
    return this;
}

document.write(window.f()); //[object Window]

২. যখন অবজেক্ট মেথডের ভিতরে ব্যবহার করা হয়

আপনি যখন thisকোনও অবজেক্ট পদ্ধতির ভিতরে কীওয়ার্ড ব্যবহার করেন , this"তাত্ক্ষণিক" এনকোলেজিং অবজেক্টের সাথে আবদ্ধ।

var obj = {
    name: "obj",
    f: function () {
        return this + ":" + this.name;
    }
};
document.write(obj.f());  //[object Object]:obj

উপরে আমি শব্দটি তাত্ক্ষণিকভাবে ডাবল উদ্ধৃতিতে রেখেছি। এটি এই বিন্দুটি তৈরি করা হয় যে আপনি যদি অন্য কোনও বস্তুর অভ্যন্তরে কোনও বস্তু বাসা thisবেঁধে দেন তবে তা তাত্ক্ষণিক পিতামাতার সাথে আবদ্ধ।

var obj = {
    name: "obj1",
    nestedobj: {
        name:"nestedobj",
        f: function () {
            return this + ":" + this.name;
        }
    }            
}

document.write(obj.nestedobj.f()); //[object Object]:nestedobj

এমনকি যদি আপনি কোনও পদক্ষেপ হিসাবে বস্তুটিতে স্পষ্টভাবে ফাংশন যুক্ত করেন তবে এটি এখনও উপরোক্ত নিয়মগুলি অনুসরণ করে যা thisএখনও তাত্ক্ষণিক প্যারেন্ট অবজেক্টের দিকে নির্দেশ করে।

var obj1 = {
    name: "obj1",
}

function returnName() {
    return this + ":" + this.name;
}

obj1.f = returnName; //add method to object
document.write(obj1.f()); //[object Object]:obj1

৩. যখন প্রসঙ্গের চেয়ে কম ফাংশন চাওয়া হয়

আপনি যখন thisঅভ্যন্তরীণ ফাংশনটি ব্যবহার করেন যা কোনও প্রসঙ্গ ছাড়াই ডাকা হয় (অর্থাত্ কোনও বস্তুর উপরে নয়), এটি বিশ্বব্যাপী অবজেক্ট ( windowব্রাউজারে) এর সাথে আবদ্ধ থাকে (এমনকি যদি বস্তুর ভিতরে ফাংশনটি সংজ্ঞায়িত হয়)।

var context = "global";

var obj = {  
    context: "object",
    method: function () {                  
        function f() {
            var context = "function";
            return this + ":" +this.context; 
        };
        return f(); //invoked without context
    }
};

document.write(obj.method()); //[object Window]:global 

ফাংশন সহ এটি চেষ্টা করে দেখছি

আমরা উপরের পয়েন্টগুলিও ফাংশন দিয়ে চেষ্টা করতে পারি। যাইহোক, কিছু পার্থক্য আছে.

  • আমরা উপরে সদস্য অবজেক্ট আক্ষরিক স্বরলিপি ব্যবহার করে বস্তুগুলিতে সদস্যদের যোগ। আমরা ব্যবহার করে সদস্যদের ফাংশনে যুক্ত করতে পারি this। তাদের নির্দিষ্ট করতে।
  • অবজেক্ট আক্ষরিক স্বরলিপি বস্তুর একটি উদাহরণ তৈরি করে যা আমরা তাত্ক্ষণিকভাবে ব্যবহার করতে পারি। ফাংশন সহ আমাদের প্রথমে newঅপারেটরটি ব্যবহার করে এর উদাহরণটি তৈরি করতে পারে ।
  • একটি বস্তুর আক্ষরিক পদ্ধতির মধ্যেও আমরা স্পষ্টভাবে বিন্দু অপারেটর ব্যবহার করে সদস্যদের ইতিমধ্যে সংজ্ঞায়িত বস্তুতে যুক্ত করতে পারি। এটি কেবলমাত্র নির্দিষ্ট উদাহরণে যুক্ত হয় to তবে আমি ফাংশন প্রোটোটাইপে পরিবর্তনশীল যুক্ত করেছি যাতে এটি ফাংশনের সমস্ত ক্ষেত্রে প্রতিফলিত হয়।

নীচে আমি অবজেক্ট এবং তারপরে যা করেছি তার সবগুলি চেষ্টা করেছিলাম this, তবে প্রথমে সরাসরি কোনও বস্তু লেখার পরিবর্তে ফাংশন তৈরি করে।

/********************************************************************* 
  1. When you add variable to the function using this keyword, it 
     gets added to the function prototype, thus allowing all function 
     instances to have their own copy of the variables added.
*********************************************************************/
function functionDef()
{
    this.name = "ObjDefinition";
    this.getName = function(){                
        return this+":"+this.name;
    }
}        

obj1 = new functionDef();
document.write(obj1.getName() + "<br />"); //[object Object]:ObjDefinition   

/********************************************************************* 
   2. Members explicitly added to the function protorype also behave 
      as above: all function instances have their own copy of the 
      variable added.
*********************************************************************/
functionDef.prototype.version = 1;
functionDef.prototype.getVersion = function(){
    return "v"+this.version; //see how this.version refers to the
                             //version variable added through 
                             //prototype
}
document.write(obj1.getVersion() + "<br />"); //v1

/********************************************************************* 
   3. Illustrating that the function variables added by both above 
      ways have their own copies across function instances
*********************************************************************/
functionDef.prototype.incrementVersion = function(){
    this.version = this.version + 1;
}
var obj2 = new functionDef();
document.write(obj2.getVersion() + "<br />"); //v1

obj2.incrementVersion();      //incrementing version in obj2
                              //does not affect obj1 version

document.write(obj2.getVersion() + "<br />"); //v2
document.write(obj1.getVersion() + "<br />"); //v1

/********************************************************************* 
   4. `this` keyword refers to the immediate parent object. If you 
       nest the object through function prototype, then `this` inside 
       object refers to the nested object not the function instance
*********************************************************************/
functionDef.prototype.nestedObj = { name: 'nestedObj', 
                                    getName1 : function(){
                                        return this+":"+this.name;
                                    }                            
                                  };

document.write(obj2.nestedObj.getName1() + "<br />"); //[object Object]:nestedObj

/********************************************************************* 
   5. If the method is on an object's prototype chain, `this` refers 
      to the object the method was called on, as if the method was on 
      the object.
*********************************************************************/
var ProtoObj = { fun: function () { return this.a } };
var obj3 = Object.create(ProtoObj); //creating an object setting ProtoObj
                                    //as its prototype
obj3.a = 999;                       //adding instance member to obj3
document.write(obj3.fun()+"<br />");//999
                                    //calling obj3.fun() makes 
                                    //ProtoObj.fun() to access obj3.a as 
                                    //if fun() is defined on obj3

৪. কনস্ট্রাক্টর ফাংশনের অভ্যন্তরে ব্যবহৃত হয়

যখন ফাংশনটি কনস্ট্রাক্টর হিসাবে ব্যবহার করা হয় (এটি তখন newকীওয়ার্ড সহ বলা হয় ) তখন thisভিতরে ফাংশনটি নতুন অবজেক্টের দিকে নির্দেশ করে।

var myname = "global context";
function SimpleFun()
{
    this.myname = "simple function";
}

var obj1 = new SimpleFun(); //adds myname to obj1
//1. `new` causes `this` inside the SimpleFun() to point to the
//   object being constructed thus adding any member
//   created inside SimipleFun() using this.membername to the
//   object being constructed
//2. And by default `new` makes function to return newly 
//   constructed object if no explicit return value is specified

document.write(obj1.myname); //simple function

5. প্রোটোটাইপ চেইনে সংজ্ঞায়িত ফাংশনের ভিতরে ব্যবহার করার সময়

যদি পদ্ধতিটি কোনও অবজেক্টের প্রোটোটাইপ শৃঙ্খলে থাকে তবে এই thisজাতীয় পদ্ধতির অভ্যন্তরে অবজেক্টটিকে বোঝানো হয় মেথডটি বলা হয়েছিল, যেমন পদ্ধতিটি কোনও বস্তুর উপর সংজ্ঞায়িত হয়েছে।

var ProtoObj = {
    fun: function () {
        return this.a;
    }
};
//Object.create() creates object with ProtoObj as its
//prototype and assigns it to obj3, thus making fun() 
//to be the method on its prototype chain

var obj3 = Object.create(ProtoObj);
obj3.a = 999;
document.write(obj3.fun()); //999

//Notice that fun() is defined on obj3's prototype but 
//`this.a` inside fun() retrieves obj3.a   

Call. কল () এর অভ্যন্তরে, প্রয়োগ করুন () এবং বাঁধুন () ফাংশন

  • এই সমস্ত পদ্ধতি উপর সংজ্ঞায়িত করা হয় Function.prototype
  • এই পদ্ধতিগুলি একবার একটি ফাংশন লিখতে এবং বিভিন্ন প্রসঙ্গে এটি প্রার্থনা করতে অনুমতি দেয়। অন্য কথায়, তারা thisফাংশনটি সম্পাদন করার সময় ব্যবহার করা হবে যার মান নির্দিষ্ট করতে দেয় । তারা যখন অনুরোধ করা হয় তখন মূল ফাংশনে যাওয়ার জন্য কোনও পরামিতি নেয় take
  • fun.apply(obj1 [, argsArray])অভ্যন্তরের obj1মান হিসাবে সেট করে এবং এর আর্গুমেন্ট হিসাবে পাসিং উপাদানগুলিকে কল করে।thisfun()fun()argsArray
  • fun.call(obj1 [, arg1 [, arg2 [,arg3 [, ...]]]])- অভ্যন্তরের obj1মান হিসাবে সেট করে এবং কলগুলি এর আর্গুমেন্ট হিসাবে পাস করে।thisfun()fun()arg1, arg2, arg3, ...
  • fun.bind(obj1 [, arg1 [, arg2 [,arg3 [, ...]]]])- অভ্যন্তরীণ মজাদার আবদ্ধ এবং নির্দিষ্ট পরামিতিগুলির সাথে আবদ্ধ প্যারামিটারগুলির funসাথে ফাংশনটির রেফারেন্স প্রদান করে ।thisobj1funarg1, arg2, arg3,...
  • এখন এর মধ্যে পার্থক্য apply, callএবং bindআপাত হয়ে আবশ্যক। applyঅ্যারে-এর মতো অবজেক্ট হিসাবে কাজ করার জন্য আর্গুমেন্টগুলি নির্দিষ্ট করতে দেয় যেমন একটি সংখ্যার lengthসম্পত্তি যুক্ত অবজেক্ট এবং সম্পর্কিত অ-নেতিবাচক পূর্ণসংখ্যার বৈশিষ্ট্য। যেখানে callসরাসরি ফাংশনটিতে যুক্তিগুলি নির্দিষ্ট করার অনুমতি দেয়। উভয়ই applyএবং callতত্ক্ষণাত নির্দিষ্ট প্রসঙ্গে এবং নির্দিষ্ট আর্গুমেন্টের সাথে ক্রিয়াকলাপটি আহ্বান করে। অন্যদিকে, bindকেবল নির্দিষ্ট thisমান এবং যুক্তিগুলির সাথে আবদ্ধ ফাংশনটি কেবল ফিরিয়ে দেয় । আমরা এই ফিরিয়ে আনা ফাংশনটির রেফারেন্সটি একটি ভেরিয়েবলের কাছে নির্ধারিত করে ক্যাপচার করতে পারি এবং পরে আমরা যে কোনও সময় এটি কল করতে পারি।
function add(inc1, inc2)
{
    return this.a + inc1 + inc2;
}

var o = { a : 4 };
document.write(add.call(o, 5, 6)+"<br />"); //15
      //above add.call(o,5,6) sets `this` inside
      //add() to `o` and calls add() resulting:
      // this.a + inc1 + inc2 = 
      // `o.a` i.e. 4 + 5 + 6 = 15
document.write(add.apply(o, [5, 6]) + "<br />"); //15
      // `o.a` i.e. 4 + 5 + 6 = 15

var g = add.bind(o, 5, 6);       //g: `o.a` i.e. 4 + 5 + 6
document.write(g()+"<br />");    //15

var h = add.bind(o, 5);          //h: `o.a` i.e. 4 + 5 + ?
document.write(h(6) + "<br />"); //15
      // 4 + 5 + 6 = 15
document.write(h() + "<br />");  //NaN
      //no parameter is passed to h()
      //thus inc2 inside add() is `undefined`
      //4 + 5 + undefined = NaN</code>

7. thisইভেন্ট হ্যান্ডলারের ভিতরে inside

  • আপনি যখন কোনও উপাদানের ইভেন্ট হ্যান্ডলারের সরাসরি ফাংশন বরাদ্দ করেন, thisসরাসরি ইভেন্ট হ্যান্ডলিং ফাংশনটির অভ্যন্তরীণ উপাদানটিকে বোঝায়। যেমন সরাসরি ফাংশন অ্যাসাইনমেন্ট addeventListenerপদ্ধতি ব্যবহার করে বা likeতিহ্যগত ইভেন্ট নিবন্ধকরণ পদ্ধতিগুলির মাধ্যমে করা যেতে পারে onclick
  • একইভাবে, আপনি যখন উপাদানটির thisইভেন্ট বৈশিষ্ট্যের (যেমন <button onclick="...this..." >) অভ্যন্তরে সরাসরি ব্যবহার করেন তখন এটি উপাদানটিকে বোঝায়।
  • তবে thisইভেন্ট হ্যান্ডলিং ফাংশন বা ইভেন্ট প্রসেসের অভ্যন্তরে ডাকা অন্য ফাংশনের মাধ্যমে অপ্রত্যক্ষভাবে ব্যবহার বিশ্বব্যাপী বস্তুর সমাধান করে window
  • যখন আমরা মাইক্রোসফ্টের ইভেন্ট নিবন্ধকরণ মডেল পদ্ধতিটি ব্যবহার করে ইভেন্ট হ্যান্ডলারের সাথে ফাংশনটি সংযুক্ত করি তখন উপরের একই আচরণটি অর্জন করা হয় attachEvent। ইভেন্ট হ্যান্ডলারের (এবং এইভাবে উপাদানটির ফাংশন পদ্ধতিটি) ফাংশনটি নির্ধারণের পরিবর্তে এটি ইভেন্টটিতে ফাংশনটিকে কল করে (কার্যকরভাবে এটি বিশ্বব্যাপী প্রেক্ষাপটে কল করে)।

আমি জেএসফিডেলে আরও ভাল করে চেষ্টা করার পরামর্শ দিচ্ছি

<script> 
    function clickedMe() {
       alert(this + " : " + this.tagName + " : " + this.id);
    } 
    document.getElementById("button1").addEventListener("click", clickedMe, false);
    document.getElementById("button2").onclick = clickedMe;
    document.getElementById("button5").attachEvent('onclick', clickedMe);   
</script>

<h3>Using `this` "directly" inside event handler or event property</h3>
<button id="button1">click() "assigned" using addEventListner() </button><br />
<button id="button2">click() "assigned" using click() </button><br />
<button id="button3" onclick="alert(this+ ' : ' + this.tagName + ' : ' + this.id);">used `this` directly in click event property</button>

<h3>Using `this` "indirectly" inside event handler or event property</h3>
<button onclick="alert((function(){return this + ' : ' + this.tagName + ' : ' + this.id;})());">`this` used indirectly, inside function <br /> defined & called inside event property</button><br />

<button id="button4" onclick="clickedMe()">`this` used indirectly, inside function <br /> called inside event property</button> <br />

IE only: <button id="button5">click() "attached" using attachEvent() </button>

8. thisES6 তীর ফাংশনে

একটি তীর ফাংশনে, thisসাধারণ ভেরিয়েবলগুলির মতো আচরণ করবে: এটি এর লেক্সিকাল স্কোপ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হবে। ফাংশনটির thisযেখানে তীর ফাংশনটি সংজ্ঞায়িত করা হয়েছে, এটি তীর ফাংশনটির হবে this

সুতরাং, এটি একই আচরণ:

(function(){}).bind(this)

নিম্নলিখিত কোডটি দেখুন:

const globalArrowFunction = () => {
  return this;
};

console.log(globalArrowFunction()); //window

const contextObject = {
  method1: () => {return this},
  method2: function(){
    return () => {return this};
  }
};

console.log(contextObject.method1()); //window

const contextLessFunction = contextObject.method1;

console.log(contextLessFunction()); //window

console.log(contextObject.method2()()) //contextObject

const innerArrowFunction = contextObject.method2();

console.log(innerArrowFunction()); //contextObject 

"আপনি যখন এটি বৈশ্বিক প্রসঙ্গে সংজ্ঞায়িত কোনও ফাংশনের অভ্যন্তরে ব্যবহার করেন, এটি এখনও বিশ্বব্যাপী অবজেক্টের সাথে আবদ্ধ, যেহেতু কার্যটি বিশ্বব্যাপী প্রসঙ্গে একটি পদ্ধতি তৈরি করা হয়েছে।" ভুল. এটি কীভাবে কোনও ফাংশন বলা হয় বা বাঁধাইয়ের মাধ্যমে সেট করা হয় , এটি সংজ্ঞায়িত করে না not একটি বেস রেফারেন্স ( "প্রসঙ্গ") ছাড়া কোনো ফাংশন কল করা হচ্ছে ডিফল্ট হবে এই বিশ্বব্যাপী বস্তু বা কঠোর মোডে undefined থাকা।
রবিজি

@ রবজি এইচএমএম হতে পারে তবে আমি এটি এমডিএন-তে পেয়েছি : এই ক্ষেত্রে, thisকলটির দ্বারা মান নির্ধারণ করা হয় না। যেহেতু কোডটি কঠোর মোডে নেই, মানটির thisসর্বদা একটি বস্তু হওয়া উচিত তাই এটি বিশ্বব্যাপী অবজেক্টের ডিফল্ট হয়। এবং প্রকৃতপক্ষে আমি কেন ভেবেছিলাম যে আমরা সরাসরি কল করতে পারি window.f1(), সুতরাং এর অর্থ f1()ইতিমধ্যে windowবস্তুর সাথে সংযুক্ত , আমি প্রার্থনার আগে বোঝাতে চাইছি। আমি কি এটা ভুল করছি?
Mahesha999

আমি আপনার এই সংস্থার সাথে "ফাংশনটি বিশ্বব্যাপী প্রসঙ্গের একটি পদ্ধতি হিসাবে তৈরি করা হয়েছে" এর সাথে সংযুক্ত করার বিষয়ে মন্তব্য করছি (সম্ভবত স্পষ্টভাবে নয়) , যেন এটি সাজানো window.fn, যা তা নয়। এই বিশ্বব্যাপী বস্তু অক্ষমতা কারণ বেস রেফারেন্স কারণ যেখানে ফাংশন সংজ্ঞায়িত করা হয় না, কল ক্ষেত্রে ব্যবহার করা হয়েছিল (তাই এই এখনো কিভাবে ফাংশন বলা হয় দ্বারা সেট করা হয়)। আপনি স্পষ্টভাবে ব্যবহার করে এটি কল যদি window.fn, তাহলে আপনি সেটিং করা হয় এই জন্য উইন্ডো । একই ফলাফল, এটি সম্পর্কে বিভিন্ন উপায়। :-)
রবিজি

"উপরে আমি অবিলম্বে শব্দটি রেখেছি ..." না আপনি করেননি didn't আপনি কি দয়া করে এটি সংশোধন করতে পারেন যাতে ত্রুটিটি স্থির হয়? উত্তরের উত্তেজনাপূর্ণ বলে মনে হচ্ছে এবং এভাবে ভুল কিছু শেখার ভয়ে ত্রুটিটি স্থির না করা পর্যন্ত আমি পড়া চালিয়ে যেতে পারি না।
টাইলারহহ

@ টাইলার এই ব্রাউজারে "তাত্ক্ষণিক" স্ট্রিং (ডাবল উদ্ধৃতি সহ) সন্ধানের জন্য এই পৃষ্ঠায় সিটিআরএল + এফ করুন, আমি মনে করি যদি আপনি ভুল বুঝতে পেরে থাকেন তবে
Mahesha999

64

জাভাস্ক্রিপ্ট এর this

সাধারণ ফাংশন প্রার্থনা

নিম্নলিখিত ফাংশন বিবেচনা করুন:

function foo() {
    console.log("bar");
    console.log(this);
}
foo(); // calling the function

নোট করুন যে আমরা এটি সাধারণ মোডে চালাচ্ছি, অর্থাত্ কঠোর মোড ব্যবহার করা হয়নি।

একটি ব্রাউজারে চলাকালীন, মান thisহিসাবে লগ করা হবে window। এটি কারণ windowএকটি ওয়েব ব্রাউজারের স্কোপে বিশ্বব্যাপী পরিবর্তনশীল।

আপনি যদি নোড.জেএস এর মতো পরিবেশে কোডটির এই একই অংশটি চালনা thisকরেন তবে আপনার অ্যাপ্লিকেশনে গ্লোবাল ভেরিয়েবলটি উল্লেখ করা হবে।

এখন আমরা যদি "use strict";ফাংশন ঘোষণার শুরুতে স্টেটমেন্টটি যুক্ত করে কঠোর মোডে এটি চালাই , thisতবে আর কোনও পরিবেশের মধ্যে বৈশ্বিক পরিবর্তনশীলকে উল্লেখ করা হবে না। কঠোর মোডে বিভ্রান্তি এড়াতে এটি করা হয়। thisএই ক্ষেত্রে কেবল লগ হবে undefined, কারণ এটি যা এটি, এটি সংজ্ঞায়িত হয় না।

নিম্নলিখিত ক্ষেত্রে, আমরা কীভাবে এর মানটি পরিচালনা করব তা দেখতে পাবেন this

কোনও বস্তুতে একটি ফাংশন কল করা

এটি করার বিভিন্ন উপায় রয়েছে। আপনি যদি জাভাস্ক্রিপ্টে নেটিভ পদ্ধতিগুলি পছন্দ করে থাকেন forEachএবং slice, আপনার ইতিমধ্যে জেনে রাখা উচিত যে সেই thisক্ষেত্রে চলকটি Objectআপনাকে সেই ফাংশনটি বলে বলে বোঝায় (নোট করুন যে জাভাস্ক্রিপ্টে, কেবলমাত্র এস এবং এস Objectসহ সমস্ত কিছু একটি )। উদাহরণস্বরূপ নীচের কোডটি নিন।ArrayFunction

var myObj = {key: "Obj"};
myObj.logThis = function () {
    // I am a method
    console.log(this);
}
myObj.logThis(); // myObj is logged

যদি Objectকোনওতে একটি সম্পত্তি থাকে যা একটি ধারণ করে থাকে Functionতবে সম্পত্তিটিকে একটি পদ্ধতি বলা হয়। এই পদ্ধতিটি, যখন ডাকা হয়, সর্বদা এটির সাথে সম্পর্কিত হওয়ার সাথে এটির thisপরিবর্তনশীল সেট থাকবে Object। এটি কঠোর এবং অ-কঠোর উভয় মোডের ক্ষেত্রেই সত্য।

নোট করুন যে কোনও পদ্ধতি যদি অন্য ভেরিয়েবলে সংরক্ষণ করা হয় (বা বরং কপি করা থাকে) তবে এর রেফারেন্সটি thisআর নতুন ভেরিয়েবলে সংরক্ষণ করা হবে না। উদাহরণ স্বরূপ:

// continuing with the previous code snippet

var myVar = myObj.logThis;
myVar();
// logs either of window/global/undefined based on mode of operation

আরও সাধারণভাবে ব্যবহারিক দৃশ্য বিবেচনা করা:

var el = document.getElementById('idOfEl');
el.addEventListener('click', function() { console.log(this) });
// the function called by addEventListener contains this as the reference to the element
// so clicking on our element would log that element itself

newশব্দ

জাভাস্ক্রিপ্টে একটি কনস্ট্রাক্টর ফাংশন বিবেচনা করুন:

function Person (name) {
    this.name = name;
    this.sayHello = function () {
        console.log ("Hello", this);
    }
}

var awal = new Person("Awal");
awal.sayHello();
// In `awal.sayHello`, `this` contains the reference to the variable `awal`

কিভাবে কাজ করে? ওয়েল, আসুন আমরা newকীওয়ার্ডটি ব্যবহার করি তখন কী ঘটে তা দেখা যাক ।

  1. newকীওয়ার্ড সহ ফাংশনটি কল করা অবিলম্বে কোনও Objectপ্রকারের আরম্ভ করবে Person
  2. এর কনস্ট্রাক্টর Objectএর কনস্ট্রাক্টর সেট করেছে Person। এছাড়াও, নোট যে শুধুমাত্র typeof awalফিরে আসবে Object
  3. এই নতুন Objectএর প্রোটোটাইপ বরাদ্দ করা হবে Person.prototype। এর অর্থ হ'ল Personপ্রোটোটাইপের যে কোনও পদ্ধতি বা সম্পত্তি হ'ল এটি Personসহ সমস্ত দৃষ্টিতে উপলব্ধ awal
  4. ফাংশন Personনিজেই এখন আহ্বান করা হয়; thisনবনির্মিত অবজেক্টের একটি রেফারেন্স হচ্ছে awal

খুব সোজা, এহ?

নোট করুন যে সরকারী ইসসিএমএসক্রিপ স্পেক কোথাও উল্লেখ করেনি যে এই ধরণের ফাংশনগুলি আসল constructorফাংশন। এগুলি কেবল সাধারণ ফাংশন, এবং যে newকোনও ফাংশনে ব্যবহার করা যেতে পারে। এটি কেবল এগুলি হিসাবে আমরা তাদের ব্যবহার করি এবং তাই আমরা তাদের কেবল এইরকম ডাকি।

ফাংশনগুলিতে কলিং ফাংশন: callএবংapply

তাই হ্যাঁ, যেহেতু functionগুলি রয়েছে Objects(এবং ইন-আসলে জাভাস্ক্রিপ্ট মধ্যে প্রথম শ্রেণীর ভেরিয়েবল), এমনকি ফাংশন পদ্ধতি যা হয় ... ভাল, নিজেদের ফাংশন আছে।

সমস্ত ফাংশনগুলি বিশ্বব্যাপী থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয় Functionএবং এর অনেকগুলি পদ্ধতির মধ্যে দুটি হ'ল callএবং applyএবং উভয়ই যে ফাংশনটিতে thisতাকে ডাকা হয় তার মানটি ব্যবহার করতে ব্যবহৃত হতে পারে ।

function foo () { console.log (this, arguments); }
var thisArg = {myObj: "is cool"};
foo.call(thisArg, 1, 2, 3);

এটি ব্যবহারের একটি সাধারণ উদাহরণ call। এটি মূলত প্রথম প্যারামিটারটি নেয় এবং একটি thisফাংশনে fooরেফারেন্স হিসাবে সেট করে thisArg। পাস করা অন্যান্য সমস্ত প্যারামিটারগুলি আর্গুমেন্ট হিসাবে callফাংশনে দেওয়া fooহয়।
সুতরাং উপরের কোডটি {myObj: "is cool"}, [1, 2, 3]কনসোলে লগইন করবে । যে thisকোনও ফাংশনের মান পরিবর্তন করার খুব সুন্দর উপায় ।

applyএটি callগ্রহণের মতো প্রায় একই যে এটি কেবল দুটি প্যারামিটার নেয়: thisArgএবং একটি অ্যারে যাতে ফাংশনে পাস করার জন্য আর্গুমেন্ট রয়েছে। সুতরাং উপরের callকলটি এটির জন্য অনুবাদ করা যেতে পারে apply:

foo.apply(thisArg, [1,2,3])

নোট করুন callএবং আমরা দ্বিতীয় বুলেটে আলোচিত বিন্দু পদ্ধতিতে অনুরোধ applyঅনুসারে thisসেটটির মানটিকে ওভাররাইড করতে পারি। যথেষ্ট সহজ :)

উপস্থাপনা .... bind!

bindএর একটি ভাই callএবং apply। এটি Functionজাভাস্ক্রিপ্টে গ্লোবাল কনস্ট্রাক্টরের সমস্ত ফাংশন দ্বারা উত্তরাধিকার সূত্রে প্রাপ্ত একটি পদ্ধতি । bindএবং call/ এর মধ্যে পার্থক্য applyহ'ল উভয়ই callএবং applyপ্রকৃতপক্ষে ফাংশনটি শুরু করবে। bindঅন্যদিকে, সঙ্গে একটি নতুন ফাংশনটি thisArgএবং argumentsপ্রাক সেট। এর আরও ভাল করে বোঝার জন্য একটি উদাহরণ নেওয়া যাক:

function foo (a, b) {
    console.log (this, arguments);
}
var thisArg = {myObj: "even more cool now"};
var bound = foo.bind(thisArg, 1, 2);
console.log (typeof bound); // logs `function`
console.log (bound);
/* logs `function () { native code }` */

bound(); // calling the function returned by `.bind`
// logs `{myObj: "even more cool now"}, [1, 2]`

তিনজনের মধ্যে পার্থক্য দেখবেন? এটি সূক্ষ্ম, তবে সেগুলি আলাদাভাবে ব্যবহৃত হয়। পছন্দ করুন callএবং apply, bindএছাড়াও thisডট-পদ্ধতি আমন্ত্রণের মাধ্যমে সেট মানকে ওভার রাইড করবে ।

এছাড়াও খেয়াল করুন যে এই তিনটি ফাংশনের কোনওটিই মূল ফাংশনে কোনও পরিবর্তন করে না। callএবং applyনতুনভাবে নির্মিত ফাংশনগুলি থেকে মানটি ফিরিয়ে দেবে এবং bindডাকা হওয়ার জন্য প্রস্তুত নতুনভাবে তৈরি ফাংশনটি নিজেই ফিরিয়ে দেবে।

অতিরিক্ত জিনিস, এটি অনুলিপি করুন

কখনও কখনও, আপনি এই thisসুযোগটি পছন্দ করেন না যে সুযোগের সাথে পরিবর্তন হয়, বিশেষত নেস্টেড স্কোপ। নীচের উদাহরণটি একবার দেখুন।

var myObj = {
    hello: function () {
        return "world"
        },
    myMethod: function () {
        // copy this, variable names are case-sensitive
        var that = this;
        // callbacks ftw \o/
        foo.bar("args", function () {
            // I want to call `hello` here
            this.hello(); // error
            // but `this` references to `foo` damn!
            // oh wait we have a backup \o/
            that.hello(); // "world"
        });
    }
  };

উপরের কোডে আমরা দেখতে পাচ্ছি যে thisনেস্টেড স্কোপ দিয়ে মানটির পরিবর্তন হয়েছে তবে আমরা thisমূল সুযোগ থেকে মানটি চেয়েছিলাম । সুতরাং আমরা 'কপি' thisকরার thatএবং ব্যবহৃত পরিবর্তে কপি this। চতুর, আহ?

সূচক:

  1. কী অনুষ্ঠিত হয় thisডিফল্টরূপে?
  2. যদি আমরা ফাংশনটিকে অবজেক্ট-ডট নোটেশন সহ একটি পদ্ধতি হিসাবে কল করি?
  3. আমরা newকীওয়ার্ডটি ব্যবহার করি ?
  4. আমরা কীভাবে এবং thisসাথে কারসাজি করব ?callapply
  5. ব্যবহার bind
  6. thisনেস্টেড-স্কোপ সমস্যাগুলি সমাধান করার জন্য অনুলিপি করা।

47

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

বেনামে বন্ধ করার মতো ফাংশনগুলির ভিতরে "এটি" ব্যবহার করার চেষ্টা করার সময় বেশিরভাগ লোক বিভ্রান্ত হন:

(ফাংশন (মান) {
    this.value = value;
    $ ( '। কিছু-উপাদান')। প্রতিটি (ফাংশন (ELT) {
        elt.innerHTML = this.value; // আহ ওহ!! সম্ভবত অপরিবর্তিত
    });
}) (2);

সুতরাং এখানে, প্রতিটি () এর ভিতরে, "এটি" আপনার কাছে প্রত্যাশা করা "মান" ধারণ করে না

this.value = value;
এটার উপরে). সুতরাং, এই (কোনও শঙ্কিত উদ্দেশ্য নয়) সমস্যাটি পেতে, একজন বিকাশকারী এটি করতে পারেন:

(ফাংশন (মান) {
    var স্ব = এটি; // ছোট পরিবরতন
    স্ব.মূল্য = মান;
    $ ( '। কিছু-উপাদান')। প্রতিটি (ফাংশন (ELT) {
        elt.innerHTML = স্ব.মূল্য; // ভাই !! == 2
    });
}) (2);

চেষ্টা কর; আপনি প্রোগ্রামিং এই প্যাটার্ন পছন্দ করতে শুরু করব



6
আদিম মানগুলির নিজস্ব কিছু পদ্ধতি রয়েছে বলে মনে হয়, যেমন স্ট্রিং # সাবস্ট্রিং (), সংখ্যা # টু স্ট্রিং () ইত্যাদি So সুতরাং, সম্ভবত that নিবন্ধটির মতো একই নামকরণ না থাকলে তারা সত্যই আচরণ করবে যেমন তারা বস্তু ছিল (তারা হ'ল সমস্ত প্রোটোটাইপড, অর্থাত্ স্ট্রিং # সাবস্ট্রিং () আসলে: স্ট্রিং.প্রোটোটাইপ.সুবস্ট্রিং = ফাংশন () {...})। আমি ভুল হলে আমাকে সংশোধন করুন।
অরুনজিৎসিংহ

12
thisশব্দ সুযোগ সঙ্গে কিছুই করার আছে। এছাড়াও, এটির ফাংশনগুলির একটি অর্থও রয়েছে যা কোনও বস্তুর বৈশিষ্ট্য নয়।
বার্গি

1
@ অরুনজিৎসিংহ that এ নিয়ে দুটি চিন্তা বিদ্যালয় রয়েছে। আমি এটি পছন্দ করি যা বলে যে " সবকিছুই একটি বস্তু, তবে কিছু সুবিধার জন্য আদিমরা দ্বারা প্রতিনিধিত্ব করা যেতে পারে "। ;-)
রবজি

9
thisসুযোগ সম্পর্কে সব না। এটি কার্যকর করার প্রসঙ্গে সমস্ত কিছুই, যা স্কোপ হিসাবে একই জিনিস নয়। জাভাস্ক্রিপ্টটি বর্ণমুখে স্কোপড (অর্থের ক্ষেত্রটি কোডের অবস্থানের ভিত্তিতে নির্ধারিত হয়) তবে thisএটি সংযুক্ত ফাংশনটি কীভাবে আহ্বান করা হয় তা দ্বারা নির্ধারিত হয় - যেখানে সেই ফাংশনটি নেই।
স্কট মারকাস

16

যেহেতু এই থ্রেডটি ছড়িয়ে পড়েছে, তাই পাঠকদের জন্য নতুন বিষয়গুলিতে কয়েকটি পয়েন্ট সংকলন করেছি this

thisনির্ধারিত মানটি কীভাবে হয় ?

আমরা ইংরাজির মতো প্রাকৃতিক ভাষায় যেমন সর্বনাম ব্যবহার করি তেমনই আমরা এটি ব্যবহার করি: "জন দ্রুত চালাচ্ছেন কারণ তিনি ট্রেন ধরার চেষ্টা করছেন।" পরিবর্তে আমরা লিখতে পারতাম "... জন ট্রেন ধরার চেষ্টা করছেন"।

var person = {    
    firstName: "Penelope",
    lastName: "Barrymore",
    fullName: function () {

    // We use "this" just as in the sentence above:
       console.log(this.firstName + " " + this.lastName);

    // We could have also written:
       console.log(person.firstName + " " + person.lastName);
    }
}

this একটি মান নির্ধারিত হয় না যতক্ষণ না একটি বস্তু ফাংশন যেখানে এটি সংজ্ঞায়িত করা হয় এমন কিছুকে ডাকে,। গ্লোবাল স্কোপে, সমস্ত গ্লোবাল ভেরিয়েবল এবং ফাংশন windowঅবজেক্টে সংজ্ঞায়িত করা হয় । সুতরাং, thisএকটি গ্লোবাল ফাংশন বলতে গ্লোবাল windowঅবজেক্ট (এবং এর মান রয়েছে) বোঝায় ।

যখন use strict, thisগ্লোবাল এবং বেনামে ফাংশনগুলিতে যা কোনও বস্তুর সাথে আবদ্ধ নয় তার মান ধরে undefined

thisশব্দ হয় সবচেয়ে ভুল বুঝে ভাবেন 1) আমরা একটি পদ্ধতি যে ব্যবহারসমূহ ধার যখন this, 2) আমরা একটি পদ্ধতি যা ব্যবহার নির্ধারণ thisএকটি পরিবর্তনশীল করতে, 3) একটি ফাংশন যে ব্যবহারসমূহ thisএকটি কলব্যাক ফাংশন হিসাবে 4 পাস করা হয়েছে, এবং) thisএকটি অবসান ভিতরে ব্যবহার করা হয় - একটি অভ্যন্তরীণ ফাংশন। (2)

টেবিল

ভবিষ্যতে কি ধারণ করে

ইসিএমএ স্ক্রিপ্ট in এ সংজ্ঞায়িত , তীর-ফাংশন thisএনকোলেসিং (ফাংশন বা গ্লোবাল) স্কোপ থেকে বাইন্ডিং গ্রহণ করে ।

function foo() {
     // return an arrow function
     return (a) => {
     // `this` here is lexically inherited from `foo()`
     console.log(this.a);
  };
}
var obj1 = { a: 2 };
var obj2 = { a: 3 };

var bar = foo.call(obj1);
bar.call( obj2 ); // 2, not 3!

তীর-ফাংশনগুলি ব্যবহারের বিকল্প সরবরাহ করার সময় bind(), এটি লক্ষ করা গুরুত্বপূর্ণ যে তারা মূলত thisআরও বিস্তৃতভাবে বোঝানো লেক্সিকাল স্কোপিংয়ের পক্ষে প্রচলিত প্রক্রিয়াটি অক্ষম করছে । (1)


তথ্যসূত্র:

  1. কাইল সিম্পসন দ্বারা নির্মিত এই ওজেক্ট প্রোটোটাইপস । © 2014 গেটিফাই সমাধানগুলি।
  2. javascriptissexy.com - http://goo.gl/pvl0GX
  3. অ্যাঙ্গাস ক্রোল - http://goo.gl/Z2RacU

16

thisজাভাস্ক্রিপ্ট সর্বদা কার্যকর করা হচ্ছে যে ফাংশন এর 'মালিক' বোঝায় ।

যদি কোনও সুস্পষ্ট মালিককে সংজ্ঞায়িত না করা হয় তবে সর্বাধিক সর্বাধিক মালিক উইন্ডো অবজেক্টটি উল্লেখ করা হয়।

তাই আমি যদি

function someKindOfFunction() {
   this.style = 'foo';
}

element.onclick = someKindOfFunction;

thisউপাদান অবজেক্ট উল্লেখ করবে। তবে সাবধান হন, প্রচুর লোক এই ভুল করে this

<element onclick="someKindOfFunction()">

পরবর্তী ক্ষেত্রে, আপনি কেবল ফাংশনটি উল্লেখ করেছেন, এটি উপাদানটির হাতে দেবেন না। অতএব, thisউইন্ডো অবজেক্ট উল্লেখ করবে।


15

প্রতিটি ফাঁসি প্রসঙ্গ জাভাস্ক্রিপ্ট একটি হয়েছে এই পরামিতি যে নির্ধারিত হয়:

  1. কীভাবে ফাংশন বলা হয় (একটি অবজেক্ট পদ্ধতি হিসাবে, কল ব্যবহার এবং প্রয়োগ , নতুন ব্যবহার সহ )
  2. বাইন্ড ব্যবহার
  3. নিখুঁতভাবে তীর ফাংশনগুলির জন্য (তারা তাদের বহিরাগত সম্পাদনের প্রসঙ্গটি এটিকে গ্রহণ করে)
  4. কোডটি কঠোর বা অ-কঠোর মোডে থাকুক না কেন
  5. কোডটি ব্যবহার করে চালিত হয়েছিল কিনা eval

আপনি এটি ব্যবহার করে এর মান সেট করতে পারেন func.call, func.applyবা func.bind

ডিফল্টরূপে এবং কোনটি প্রাথমিকভাবে বিভ্রান্ত করে, যখন কোনও শ্রোতাকে কোনও ডিওএম উপাদানের উপরে উত্থাপিত হওয়ার পরে ডাকা হয় তখন ফাংশনের এই মানটি হয় ডিওএম উপাদান।

jQuery jQuery.proxy দিয়ে পরিবর্তন করতে এই তুচ্ছ করে তোলে।


9
এটি বলা আরও একটু সঠিক যে প্রতিটি ফাংশন কলের একটি সুযোগ রয়েছে। অন্য কথায়, কি বিষয়ে বিভ্রান্তিকর এর thisজাভাস্ক্রিপ্ট মধ্যে এটি হয় না ফাংশন নিজেই একটি স্বকীয় সম্পত্তি, বরং পথ ফাংশন প্রার্থনা করা হয় একটি হস্তনির্মিত বস্তু।
পয়েন্টটি

@ পয়েন্ট ধন্যবাদ। জেএস-এ এটি সম্পর্কে সবচেয়ে বিভ্রান্তির কারণ কী তা হ'ল এটি আগে ব্যবহৃত সমস্ত ভাষায় (সি #, সি ++), - এটি হেরফের করা যায় না সবসময় বস্তুর উদাহরণকে নির্দেশ করে যেখানে জেএসে এটি নির্ভর করে এবং যখন অনুরোধ করা হয় তখন পরিবর্তন করা যায় ফাংশন ব্যবহার করে func.call, func.bindইত্যাদি - সুশীল
সুশীল

2
thisএকটি ফাংশন এর সুযোগ উল্লেখ করে নাthisএকটি নির্দিষ্ট অবজেক্ট (বা সম্ভবত undefined) উল্লেখ করবে , যা আপনি বলেছিলেন .call()বা ব্যবহার করে পরিবর্তন করা যেতে পারে .apply()। কোনও ফাংশনের সুযোগটি (মূলত সরলীকরণের সময়) কোন ভেরিয়েবলের অ্যাক্সেস রয়েছে তা এবং এটি পুরোপুরি নির্ভর করে যেখানে ফাংশনটি ঘোষিত হয়েছে এবং পরিবর্তন করা যাবে না তার উপর।
nnnnnn

@ পয়েন্ট: "প্রতিটি ফাংশন কলের একটি সুযোগ রয়েছে তা বলা একটু বেশি সঠিক।" এমনকি আরও সঠিক বলতে চাই যে ফাংশন (এবং এখন ব্লক) আছে সুযোগ , ফাংশন কল আছে প্রেক্ষাপটে । স্কোপ শনাক্তকরণগুলি কী তা নির্দিষ্ট করে যেগুলি সেই সুযোগের কোড দ্বারা ব্যবহার করা যেতে পারে। প্রসঙ্গটি সেই শনাক্তকারীদের কী আবদ্ধ তা নির্ধারণ করে।
টিজে ক্রাউডার

1
"যে সুযোগটি যাই হোক না কেন," এটি "দ্বারা রেফারেন্স করা হয়।" না, thisএবং সুযোগের ES5 এবং এর আগে একে অপরের সাথে যা করার কিছুই নেই (যেমন, যখন এই উত্তরটি লেখা হয়েছিল) written ES2015 (ওরফে ES6) এ thisএবং স্কোপটি সম্পর্কিত একটি মোটামুটি ন্যূনতম উপায় রিট তীর ফাংশন সম্পর্কিত ( thisএকটি তীর ফাংশনটিতে তার ঘেরের সুযোগ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত), তবে thisকখনও কোনও সুযোগকে বোঝায় না।
টিজে ক্রাউডার

10

এখানে এক ভাল উৎস thisমধ্যে JavaScript

এখানে সংক্ষিপ্তসার:

  • বিশ্বব্যাপী এই

    একটি ব্রাউজারে, গ্লোবাল স্কোপ এ thisহল windowবস্তুর

    <script type="text/javascript">
      console.log(this === window); // true
      var foo = "bar";
      console.log(this.foo); // "bar"
      console.log(window.foo); // "bar"

    ইন noderepl ব্যবহার করে, thisশীর্ষ নামস্থান হয়। আপনি এটি হিসাবে উল্লেখ করতে পারেন global

    >this
      { ArrayBuffer: [Function: ArrayBuffer],
        Int8Array: { [Function: Int8Array] BYTES_PER_ELEMENT: 1 },
        Uint8Array: { [Function: Uint8Array] BYTES_PER_ELEMENT: 1 },
        ...
    >global === this
     true

    ইন nodeএকটি স্ক্রিপ্ট থেকে নির্বাহ thisবিশ্বব্যাপী সুযোগ এ একটি খালি অবজেক্ট হিসেবে শুরু হয়। এটা যেমন হয় নাglobal

    \\test.js
    console.log(this);  \\ {}
    console.log(this === global); \\ fasle
  • এই কাজ

ডিওএম ইভেন্ট হ্যান্ডলারের ক্ষেত্রে বা যখন কোনও thisArgসরবরাহ করা হয় (আরও নীচে দেখুন), উভয় নোডে এবং কোনও ব্রাউজারে thisএমন কোনও ফাংশন ব্যবহার করে newযা বিশ্বব্যাপী ক্ষেত্রের উল্লেখগুলির সাথে বলা হয় না …

<script type="text/javascript">
    foo = "bar";

    function testThis() {
      this.foo = "foo";
    }

    console.log(this.foo); //logs "bar"
    testThis();
    console.log(this.foo); //logs "foo"
</script>

আপনি যদি ব্যবহার use strict;করেন তবে কোন ক্ষেত্রে thisহবেundefined

<script type="text/javascript">
    foo = "bar";

    function testThis() {
      "use strict";
      this.foo = "foo";
    }

    console.log(this.foo); //logs "bar"
    testThis();  //Uncaught TypeError: Cannot set property 'foo' of undefined 
</script>

আপনি যদি কোনও ক্রিয়াকলাপটিকে কল newকরে থাকেন thisতবে এটি একটি নতুন প্রসঙ্গ হবে, এটি বিশ্বব্যাপী উল্লেখ করবে না this

<script type="text/javascript">
    foo = "bar";

    function testThis() {
      this.foo = "foo";
    }

    console.log(this.foo); //logs "bar"
    new testThis();
    console.log(this.foo); //logs "bar"

    console.log(new testThis().foo); //logs "foo"
</script>
  • প্রোটোটাইপ এটি

আপনার তৈরি করা ফাংশনগুলি ফাংশন অবজেক্টে পরিণত হয়। তারা স্বয়ংক্রিয়ভাবে একটি বিশেষ prototypeসম্পত্তি পায় যা আপনি মান নির্ধারণ করতে পারেন এমন একটি জিনিস। আপনি যখন আপনার ফাংশনটির সাথে কল করে কোনও উদাহরণ তৈরি করেন newআপনি prototypeসম্পত্তিটিতে নির্ধারিত মানগুলিতে অ্যাক্সেস পান । আপনি সেই মানগুলি ব্যবহার করে অ্যাক্সেস করুন this

function Thing() {
  console.log(this.foo);
}

Thing.prototype.foo = "bar";

var thing = new Thing(); //logs "bar"
console.log(thing.foo);  //logs "bar"

এটি সাধারণত দায়িত্ব অর্পণ করা একটি ভুল অ্যারে বা বস্তু উপর prototype। আপনি যদি প্রত্যেকের নিজস্ব নিজস্ব অ্যারে করতে চান তবে প্রোটোটাইপ নয়, ফাংশনে এগুলি তৈরি করুন।

function Thing() {
    this.things = [];
}

var thing1 = new Thing();
var thing2 = new Thing();
thing1.things.push("foo");
console.log(thing1.things); //logs ["foo"]
console.log(thing2.things); //logs []
  • এই আপত্তি

আপনি thisযে বস্তুর অন্য কোনও বৈশিষ্ট্যে সেই অবজেক্টের অন্যান্য বৈশিষ্ট্যগুলি উল্লেখ করতে ব্যবহার করতে পারেন । এটি যেমন তৈরি করা উদাহরণ হিসাবে একই নয় new

var obj = {
    foo: "bar",
    logFoo: function () {
        console.log(this.foo);
    }
};

obj.logFoo(); //logs "bar"
  • এটি ডম ইভেন্ট

এইচটিএমএল ডিওএম ইভেন্ট হ্যান্ডলারটিতে, thisইভেন্টটি যে সংযুক্ত ছিল তার সবসময়ই ডিওএম উপাদান সম্পর্কিত একটি উল্লেখ

function Listener() {
    document.getElementById("foo").addEventListener("click",
       this.handleClick);
}
Listener.prototype.handleClick = function (event) {
    console.log(this); //logs "<div id="foo"></div>"
}

var listener = new Listener();
document.getElementById("foo").click();

আপনি যদি না bindপ্রসঙ্গ

function Listener() {
    document.getElementById("foo").addEventListener("click", 
        this.handleClick.bind(this));
}
Listener.prototype.handleClick = function (event) {
    console.log(this); //logs Listener {handleClick: function}
}

var listener = new Listener();
document.getElementById("foo").click();
  • এইচটিএমএল

এইচটিএমএল বৈশিষ্ট্যগুলির ভিতরে যা আপনি জাভাস্ক্রিপ্ট রাখতে পারেন, thisএটি উপাদানটির একটি রেফারেন্স।

<div id="foo" onclick="console.log(this);"></div>
<script type="text/javascript">
document.getElementById("foo").click(); //logs <div id="foo"...
</script>
  • এটি প্রকাশ করুন

আপনি evalঅ্যাক্সেস ব্যবহার করতে পারেন this

function Thing () {
}
Thing.prototype.foo = "bar";
Thing.prototype.logFoo = function () {
    eval("console.log(this.foo)"); //logs "bar"
}

var thing = new Thing();
thing.logFoo();
  • এর সাথে

আপনি স্পষ্টভাবে উল্লেখ না করে মান পড়তে এবং লিখতে বর্তমান স্কোপটিতে withযুক্ত করতে ব্যবহার করতে পারেন ।thisthisthis

function Thing () {
}
Thing.prototype.foo = "bar";
Thing.prototype.logFoo = function () {
    with (this) {
        console.log(foo);
        foo = "foo";
    }
}

var thing = new Thing();
thing.logFoo(); // logs "bar"
console.log(thing.foo); // logs "foo"
  • jQuery এটি

jQuery অনেক জায়গায় thisএকটি DOM উপাদান উল্লেখ করে।

<div class="foo bar1"></div>
<div class="foo bar2"></div>
<script type="text/javascript">
$(".foo").each(function () {
    console.log(this); //logs <div class="foo...
});
$(".foo").on("click", function () {
    console.log(this); //logs <div class="foo...
});
$(".foo").each(function () {
    this.click();
});
</script>

9

ড্যানিয়েল, দারুণ ব্যাখ্যা! এটিতে কয়েকটি শব্দ এবং thisইভেন্ট হ্যান্ডলারের ক্ষেত্রে সম্পাদনা প্রসঙ্গে পয়েন্টারটির ভাল তালিকা ।

দুটি কথায়, thisজাভাস্ক্রিপ্টে বস্তুটি কার কাছ থেকে (বা যার প্রয়োগের প্রেক্ষাপট থেকে) বর্তমান ফাংশনটি চালিত হয়েছিল এবং এটি সর্বদা কেবল পঠনযোগ্য, আপনি সেটাকে সেট করতে পারবেন না (এই জাতীয় প্রচেষ্টা 'অবৈধ বাম-হাত দিয়ে শেষ হবে) পাশের অ্যাসাইনমেন্ট 'বার্তা।

ইভেন্ট হ্যান্ডেলারদের জন্য: ইনলাইন ইভেন্ট হ্যান্ডলারগুলি যেমন <element onclick="foo">, আগে এবং আগে সংযুক্ত অন্য কোনও হ্যান্ডলারকে ওভাররাইড করে, তাই সাবধান হন এবং একেবারে ইনলাইন ইভেন্ট প্রতিনিধি দলের বাইরে থাকাই ভাল। এবং জারা আলাভার্ডিয়ানকে ধন্যবাদ জানাই যিনি আমাকে ভিন্ন ভিন্ন বিতর্কের মাধ্যমে উদাহরণগুলির এই তালিকায় অনুপ্রাণিত করেছিলেন :)

  • el.onclick = foo; // in the foo - obj
  • el.onclick = function () {this.style.color = '#fff';} // obj
  • el.onclick = function() {doSomething();} // In the doSomething - Window
  • el.addEventListener('click',foo,false) // in the foo - obj
  • el.attachEvent('onclick, function () { // this }') // window, all the compliance to IE :)
  • <button onclick="this.style.color = '#fff';"> // obj
  • <button onclick="foo"> // In the foo - window, but you can <button onclick="foo(this)">

9

"এই" কীওয়ার্ডটি জাভাস্ক্রিপ্টে কীভাবে ব্যাখ্যা করা যায় তা নিয়ে অনেক বিভ্রান্তি রয়েছে । আশা করি এই নিবন্ধটি তাদের সকলকে একবার এবং সকলের জন্য বিশ্রাম দেবে। এবং আরো অনেক কিছু. পুরো নিবন্ধটি মনোযোগ সহকারে পড়ুন দয়া করে। এই নিবন্ধটি দীর্ঘ যে আগাম সতর্কতা অবলম্বন করুন।

এটি যে প্রসঙ্গে ব্যবহৃত হয় তা নির্বিশেষে, "এটি" জাভাস্ক্রিপ্টে সর্বদা "বর্তমান অবজেক্ট" উল্লেখ করে । যাইহোক, "বর্তমান অবজেক্ট" প্রসঙ্গ অনুযায়ী পৃথক কী । প্রসঙ্গ ঠিক হতে পারে 6 1 নিম্নলিখিত:

  1. গ্লোবাল (অর্থাত্ সমস্ত ফাংশনের বাইরে)
  2. ডাইরেক্ট "নন বাউন্ড ফাংশন" কলের অভ্যন্তরে (যেমন একটি ফাংশন যা ফাংশননেম.বাইন্ড কল করে আবদ্ধ হয়নি )
  3. ইনসাইড পরোক্ষ "অ বাউন্ড ফাংশন" কল মাধ্যমে functionName.call এবং functionName.apply
  4. "বাউন্ড ফাংশন" কলের অভ্যন্তরে (যেমন একটি ফাংশন যা ফাংশননেম.বাইন্ড কল করে আবদ্ধ হয়েছে )
  5. "নতুন" এর মাধ্যমে অবজেক্ট ক্রিয়েশন করার সময়
  6. ভিতরে ইনলাইন ডিওএম ইভেন্ট হ্যান্ডলার

নিম্নলিখিত এই প্রতিটি প্রসঙ্গে একটি করে বর্ণনা করে:

  1. গ্লোবাল কনটেক্সট (অর্থাত্ সমস্ত ফাংশনের বাইরে):

    সমস্ত ফাংশনের বাইরে (যেমন বৈশ্বিক প্রেক্ষাপটে) "বর্তমান অবজেক্ট" (এবং তাই "এটি" এর মান ) ব্রাউজারগুলির জন্য সর্বদা "উইন্ডো" অবজেক্ট।

  2. ভিতরে সরাসরি "বেঁধে ফাংশন" কল করুন :

    ডাইরেক্ট "নন বাউন্ড ফাংশন" কল এর অভ্যন্তরে, যে ফাংশন কলটি চালু করেছিল সেই বস্তুটি "বর্তমান অবজেক্ট" (এবং তাই "এটি" এর মান ) হয়ে যায়। যদি কোনও ফাংশন সুস্পষ্ট বর্তমান অবজেক্ট ছাড়াই ডাকা হয় , বর্তমান অবজেক্টটি হয় "উইন্ডো" অবজেক্ট (নন স্ট্রিক্ট মোডের জন্য) বা অপরিজ্ঞাত (স্ট্রাইক মোডের জন্য)। গ্লোবাল কনটেক্সটে সংজ্ঞায়িত যে কোনও ফাংশন (বা ভেরিয়েবল) স্বয়ংক্রিয়ভাবে "উইন্ডো" অবজেক্টের সম্পত্তি হয়ে যায় For উদাহরণস্বরূপ ধরুন গ্লোবাল প্রসঙ্গে যেমন ফাংশনটি সংজ্ঞায়িত করা হয়েছে

    function UserDefinedFunction(){
        alert(this)
        }

    এটি উইন্ডো অবজেক্টের সম্পত্তি হয়ে যায়, আপনি যেমন এটি সংজ্ঞায়িত করেছেন

    window.UserDefinedFunction=function(){
      alert(this)
    }  

    "অ কঠোর মোড" ইন, কলিং / সরাসরি মাধ্যমে এই ফাংশন invoking "() UserDefinedFunction" স্বয়ংক্রিয়ভাবে / এটি ডাকা যেমন ডাকব "window.UserDefinedFunction ()" উপার্জন "উইন্ডো" হিসাবে "বর্তমান বস্তুর" (এবং অত: পর মান " এটি " ) " ব্যবহারকারীর সংজ্ঞায়িত ফাংশন "এর মধ্যে।" নন স্ট্রিক্ট মোড "এ এই ফাংশনটি প্রত্যাখ্যান করার ফলে নিম্নলিখিত ফলাফল হবে

    UserDefinedFunction() // displays [object Window]  as it automatically gets invoked as window.UserDefinedFunction()

    "কঠোর মোড" কল করা হচ্ছে / সরাসরি মাধ্যমে ফাংশন invoking সালে "UserDefinedFunction ()" হবে "না" স্বয়ংক্রিয়ভাবে / এটি ডাকা কল "window.UserDefinedFunction ()" .Hence "বর্তমান বস্তুর" (এবং এর মান "এই" ) মধ্যে "UserDefinedFunction" হইবে undefined । "কঠোর মোডে" এই ক্রিয়াকলাপটি চালনার ফলে নিম্নলিখিত ফলাফলগুলি হবে

    UserDefinedFunction() // displays undefined

    যাইহোক, উইন্ডো অবজেক্টটি স্পষ্টভাবে এটির অনুরোধের ফলে নিম্নলিখিতটির ফলাফল আসবে

    window.UserDefinedFunction() // "always displays [object Window]   irrespective of mode."

    আসুন অন্য একটি উদাহরণ তাকান। দয়া করে নীচের কোডটি দেখুন

     function UserDefinedFunction()
        {
            alert(this.a + ","  + this.b + ","  + this.c  + ","  + this.d)
        }
    
    var o1={
                a:1,
                b:2,
                f:UserDefinedFunction
          }
    var o2={
                c:3,
                d:4,
                f:UserDefinedFunction
           }
    
    o1.f() // Shall display 1,2,undefined,undefined
    o2.f() // Shall display undefined,undefined,3,4

    উপরের উদাহরণে আমরা দেখতে যে, যখন "UserDefinedFunction" মাধ্যমে চালানো হয়েছিল O1 , "এই" এর মান লাগে O1 এবং তার সম্পত্তি মান "A" এবং "B" প্রদর্শিত হয়। এর মান "C" এবং "D" হিসাবে দেখানো হয়েছে undefined যেমন O1 এই বৈশিষ্ট্য নির্ধারণ করে না

    একইভাবে যখন "UserDefinedFunction" মাধ্যমে চালানো হয়েছিল O2 , "এই" এর মান লাগে O2 এবং তার সম্পত্তি মান "C" এবং "D" এর displayed.The মান পেতে "A" এবং "B" হিসাবে দেখানো হয়েছে undefined যেমন O2 করে এই বৈশিষ্ট্য সংজ্ঞায়িত না।

  3. ইনসাইড পরোক্ষ "অ বাউন্ড ফাংশন" কল মাধ্যমে functionName.call এবং functionName.apply :

    যখন "নন বাউন্ড ফাংশন" ফাংশননেম. call বা ফাংশননেম.প্লাইয়ের মাধ্যমে কল করা হয় , "বর্তমান অবজেক্ট" (এবং " সুতরাং " এর মান সেট করা হয়) "এই" পরামিতিটির (প্রথম পরামিতি) কল করতে পাস করা হয় / প্রয়োগ । নিম্নলিখিত কোডটি একই দেখায়।

    function UserDefinedFunction()
    {
        alert(this.a + ","  + this.b + ","  + this.c  + ","  + this.d)
    }
    var o1={
                a:1,
                b:2,
                f:UserDefinedFunction
           }
    var o2={
                c:3,
                d:4,
                f:UserDefinedFunction
           }
    
    UserDefinedFunction.call(o1) // Shall display 1,2,undefined,undefined
    UserDefinedFunction.apply(o1) // Shall display 1,2,undefined,undefined
    
    UserDefinedFunction.call(o2) // Shall display undefined,undefined,3,4
    UserDefinedFunction.apply(o2) // Shall display undefined,undefined,3,4
    
    o1.f.call(o2) // Shall display undefined,undefined,3,4
    o1.f.apply(o2) // Shall display undefined,undefined,3,4
    
    o2.f.call(o1) // Shall display 1,2,undefined,undefined
    o2.f.apply(o1) // Shall display 1,2,undefined,undefined

    উপরের কোডটি পরিষ্কারভাবে দেখায় যে কোনও "নন বাউন্ড ফাংশন" এর জন্য "এই" মানটি কল / প্রয়োগের মাধ্যমে পরিবর্তন করা যেতে পারে । এছাড়াও, যদি "এই" প্যারামিটারটি স্পষ্টভাবে কল / প্রয়োগের জন্য পাস না করা হয় , "বর্তমান অবজেক্ট" (এবং সেইজন্য "এই" এর মানটি "উইন্ডো" নন স্ট্রাক্ট মোডে এবং কঠোর মোডে "অপরিজ্ঞাত" সেট করা হয়) ।

  4. "বাউন্ড ফাংশন" কলের অভ্যন্তরে (যেমন একটি ফাংশন যা ফাংশননেম.বাইন্ড কল করে আবদ্ধ হয়েছে ):

    একটি আবদ্ধ ফাংশন একটি ফাংশন যার "এই" মানটি স্থির করা হয়েছে। নিম্নলিখিত কোডটি দেখিয়েছে যে আবদ্ধ ফাংশনের ক্ষেত্রে "এই" কীভাবে কাজ করে

    function UserDefinedFunction()
    {
        alert(this.a + ","  + this.b + ","  + this.c  + ","  + this.d)
    }
    var o1={
              a:1,
              b:2,
              f:UserDefinedFunction,
              bf:null
           }
    var o2={
               c:3,
               d:4,
               f:UserDefinedFunction,
               bf:null
            }
    
    var bound1=UserDefinedFunction.bind(o1); // permanantly fixes "this" value of function "bound1" to Object o1
    bound1() // Shall display 1,2,undefined,undefined
    
    var bound2=UserDefinedFunction.bind(o2); // permanantly fixes "this" value of function "bound2" to Object o2
    bound2() // Shall display undefined,undefined,3,4
    
    var bound3=o1.f.bind(o2); // permanantly fixes "this" value of function "bound3" to Object o2
    bound3() // Shall display undefined,undefined,3,4
    
    var bound4=o2.f.bind(o1); // permanantly fixes "this" value of function "bound4" to Object o1
    bound4() // Shall display 1,2,undefined,undefined
    
    o1.bf=UserDefinedFunction.bind(o2) // permanantly fixes "this" value of function "o1.bf" to Object o2
    o1.bf() // Shall display undefined,undefined,3,4
    
    o2.bf=UserDefinedFunction.bind(o1) // permanantly fixes "this" value of function "o2.bf" to Object o1
    o2.bf() // Shall display 1,2,undefined,undefined
    
    bound1.call(o2) // Shall still display 1,2,undefined,undefined. "call" cannot alter the value of "this" for bound function
    
    bound1.apply(o2) // Shall still display 1,2,undefined,undefined. "apply" cannot alter the value of "this" for bound function
    
    o2.bf.call(o2) // Shall still display 1,2,undefined,undefined. "call" cannot alter the value of "this" for bound function
    o2.bf.apply(o2) // Shall still display 1,2,undefined,undefined."apply" cannot alter the value of "this" for bound function

    উপরের কোডে যেমন দেওয়া আছে, কোনও "বাউন্ড ফাংশন" এর জন্য "এই" মান কল / আবেদনের মাধ্যমে পরিবর্তন করা যাবে না । এছাড়াও, যদি "এই" প্যারামিটারটি স্পষ্টভাবে বাঁধাই করতে না দেওয়া হয়, "বর্তমান অবজেক্ট" (এবং সেইজন্য "এই" এর মানটি ) নন কড়া মোডে "উইন্ডো" এবং কঠোর মোডে "অপরিজ্ঞাত" সেট করা হয়। আরেকটা জিনিস. ইতিমধ্যে আবদ্ধ ফাংশন বাঁধাই "এটি" এর মান পরিবর্তন করে না । এটি প্রথম বাইন্ড ফাংশন দ্বারা সেট করা মান হিসাবে সেট থাকে।

  5. "নতুন" এর মাধ্যমে অবজেক্ট ক্রিয়েশন করার সময় :

    একটি কন্সট্রাকটর ফাংশন, ইনসাইড "বর্তমান বস্তুর" (এবং অত: পর মান "এই" ) রেফারেন্স বস্তু বর্তমানে মাধ্যমে তৈরি করা হচ্ছে "নতুন" ফাংশনের বেঁধে অবস্থা নির্বিশেষে। তবে যদি কনস্ট্রাক্টর একটি বাউন্ড ফাংশন হয় তবে এটি আবদ্ধ ফাংশনের জন্য সেট হিসাবে পূর্বনির্ধারিত আর্গুমেন্টের সাথে ডাকা হবে।

  6. ইনলাইন ডোম ইভেন্ট হ্যান্ডলার ভিতরে :

    দয়া করে নীচের এইচটিএমএল স্নিপেটটি দেখুন

    <button onclick='this.style.color=white'>Hello World</button>
    <div style='width:100px;height:100px;' onclick='OnDivClick(event,this)'>Hello World</div>

    "এই" মধ্যে উপরের উদাহরণগুলোতে যথাক্রমে "বোতাম" উপাদান এবং "DIV আছে" উপাদান পড়ুন।

    প্রথম উদাহরণে, বোতামটির ফন্টের রঙটি ক্লিক করা হলে সাদা সেট করা হবে।

    দ্বিতীয় উদাহরণে যখন " ডিভ " উপাদানটি ক্লিক করা হয় তখন এটি ক্লিক করা ডিভ উপাদানটির উল্লেখ করে তার দ্বিতীয় পরামিতি সহ অনডিভক্লিক ফাংশনটিকে কল করবে । তবে এর মান "এই" OnDivClick মধ্যে না ক্লিক রেফারেন্স DIV আছে উপাদান। এটা তোলে হিসাবে সেট হইবে "উইন্ডো বস্তুর" বা "undefined" মধ্যে অ কঠোর এবং যথাযথ মোডগুলি যথাক্রমে (যদি OnDivClick একটি হল আনবাউন্ড ফাংশন ) অথবা একটি পূর্বনির্ধারিত বাউন্ড মান সেট (যদি OnDivClick একটি হল আবদ্ধ ফাংশন )

নিম্নলিখিত নিবন্ধটি সারাংশ সংক্ষেপে

  1. গ্লোবাল প্রসঙ্গে "এটি" সর্বদা "উইন্ডো" অবজেক্টকে বোঝায়

  2. যখনই কোনও ফাংশন ডাকা হয় তখন এটি কোনও বস্তুর ( "বর্তমান অবজেক্ট" ) এর প্রসঙ্গে আহ্বান জানানো হয় । তাহলে বর্তমান বস্তুর স্পষ্টভাবে দেওয়া হয় না, বর্তমান বস্তুর হয় "উইন্ডো বস্তুর" মধ্যে অ কঠোর মোডে এবং "undefined" ডিফল্টরূপে কঠোর মোডে।

  3. নন-বাউন্ড ফাংশনের মধ্যে "এটি" এর মান হ'ল অবজেক্টের রেফারেন্স যা প্রসঙ্গে ফাংশনটি চাওয়া হয় ( "বর্তমান অবজেক্ট" )

  4. এর মান "এই" মধ্যে একটি অ বাউন্ড ফাংশন দ্বারা ওভাররাইড করা যেতে পারে কল এবং প্রয়োগ ফাংশন পদ্ধতি।

  5. এর মান "এই" সমুদ্রের সীমা ফাংশন জন্য সংশোধন করা হয়েছে এবং এর মাধ্যমে ওভাররাইড করা যাবে না কল এবং প্রয়োগ ফাংশন পদ্ধতি।

  6. বাঁধাই এবং ইতিমধ্যে আবদ্ধ ফাংশন "এটি" এর মান পরিবর্তন করে না। এটি প্রথম বাইন্ড ফাংশন দ্বারা সেট করা মান হিসাবে সেট থাকে।

  7. কনস্ট্রাক্টরের মধ্যে "এটি" এর মান হ'ল সেই বস্তু যা তৈরি এবং সূচনা করা হচ্ছে

  8. একটি ইনলাইন ডিওএম ইভেন্ট হ্যান্ডলারের মধ্যে "এটি" এর মান হল ইভেন্টের হ্যান্ডলারটি দেওয়া হয় এমন উপাদানটির জন্য উল্লেখ।


9

সম্ভবত সবচেয়ে বিস্তারিত এবং বিস্তৃত নিবন্ধটি thisনিম্নলিখিত:

জাভাস্ক্রিপ্টে 'এই' কীওয়ার্ডটির কোমল ব্যাখ্যা

পিছনে ধারণাটি thisবুঝতে হবে যে ফাংশন আমন্ত্রণের ধরণের thisমান নির্ধারণের ক্ষেত্রে উল্লেখযোগ্য গুরুত্ব রয়েছে ।


সনাক্ত করতে সমস্যা হচ্ছে this, নিজেকে জিজ্ঞাসা করবেন না :

কোথা thisথেকে নেওয়া হয় ?

তবে নিজেকে জিজ্ঞাসা করুন:

ফাংশনটি কিভাবে চালিত হয় ?

একটি তীর ফাংশনের জন্য (প্রসঙ্গের স্বচ্ছতার বিশেষ ক্ষেত্রে) নিজেকে জিজ্ঞাসা করুন:

thisতীর ফাংশন সংজ্ঞায়িত হয়েছে যেখানে কোন মান আছে ?

ডিল করার সময় এই মানসিকতাটি সঠিক thisএবং আপনাকে মাথা ব্যথার হাত থেকে বাঁচাবে।


আপনার ব্লগের সাথে লিঙ্ক করার পাশাপাশি, আপনি এই প্রশ্নগুলি জিজ্ঞাসা কীভাবে thisকীওয়ার্ড বুঝতে সাহায্য করে তা সম্পর্কে আপনি আরও গভীরভাবে আবিষ্কার করতে পারেন ?
ম্যাগনাস লিন্ড অক্সলুন্ড

7

এই শ্রেষ্ঠ ব্যাখ্যা আমি দেখা করেছি JavaScripts বুঝুন এই স্বচ্ছতার সঙ্গে

এই রেফারেন্স সর্বদা বোঝায় (এবং মান ঝুলিতে) যদিও এটি বিশ্বব্যাপী সুযোগ একটি ফাংশন বাহিরে ব্যবহার করা যেতে পারে একটি বস্তু-একটি একবচন অবজেক্ট এবং এটি সাধারণত একটি ফাংশান বা একটা পদ্ধতি ভিতরে ব্যবহার করা হয়। মনে রাখবেন যে আমরা যখন কঠোর মোড ব্যবহার করি তখন এটি বৈশ্বিক ফাংশনগুলিতে এবং বেনামে ফাংশনগুলিতে অপরিজ্ঞাতকৃত মানকে ধারণ করে যা কোনও বস্তুর সাথে আবদ্ধ নয়।

সেখানে চার প্রেক্ষাপটে কোথায় আছেন তা এই বিভ্রান্তিকর হতে পারে:

  1. আমরা যখন একটি পদ্ধতি (যে ব্যবহার পাস এই ) একটি আর্গুমেন্ট হিসাবে একটি কলব্যাক ফাংশন হিসাবে ব্যবহৃত হবে।
  2. যখন আমরা একটি অভ্যন্তরীণ ফাংশন (একটি বন্ধ) ব্যবহার করি। এই নোটটি গ্রহণ করা গুরুত্বপূর্ণ যে ক্লোজারগুলি এই কীওয়ার্ডটি ব্যবহার করে বাইরের ফাংশনের এই ভেরিয়েবলটি অ্যাক্সেস করতে পারে না কারণ এই ভেরিয়েবলটি কেবলমাত্র ফাংশন দ্বারা প্রবেশযোগ্য, অভ্যন্তরীণ ফাংশন দ্বারা নয় by
  3. একটি পদ্ধতি যার উপর নির্ভর করে যখন এই প্রেক্ষিতে জুড়ে একটি পরিবর্তনশীল, যে ক্ষেত্রে নির্ধারিত হয় এই রেফারেন্স অন্য বস্তুর চেয়ে মূলত উদ্দেশ্যে।
  4. যখন ব্যবহার এই বেঁধে সহ, প্রযোজ্য এবং কল পদ্ধতি।

তিনি কোড উদাহরণ, ব্যাখ্যা এবং সমাধান দেন, যা আমি ভেবেছিলাম খুব সহায়ক ছিল।


6

সিউডোক্ল্যাসিকাল ভাষায়, অনেক বক্তৃতা যেভাবে 'এই' কীওয়ার্ডটি শেখায় কোনও শ্রেণি বা অবজেক্ট কনস্ট্রাক্টর দ্বারা ইনস্ট্যান্টিয়েটেড একটি বস্তু হিসাবে। প্রতিবার একটি ক্লাস থেকে যখন কোনও নতুন অবজেক্ট তৈরি করা হয়, তা কল্পনা করুন যে হুডের নীচে 'এই' অবজেক্টটির স্থানীয় উদাহরণ তৈরি হয়েছে এবং ফিরে আসবে। আমি মনে করি এটি এরকম শিখিয়েছে:

function Car(make, model, year) {
var this = {}; // under the hood, so to speak
this.make = make;
this.model = model;
this.year = year;
return this; // under the hood
}

var mycar = new Car('Eagle', 'Talon TSi', 1993);
// ========= under the hood
var this = {};
this.make = 'Eagle';
this.model = 'Talon TSi';
this.year = 1993;
return this;

5

thisজাভাস্ক্রিপ্টের একটি ভুল ধারণা রয়েছে বলে এটি স্থান থেকে অন্য জায়গায় কিছুটা আলাদা আচরণ করে। সহজভাবে, বর্তমানে আমরা যে ফাংশনটি চালাচ্ছিthis তার "মালিক" বোঝায় ।

thisআমাদের সাথে কাজ করা বর্তমান অবজেক্ট (ওরফে এক্সিকিউশন প্রসঙ্গ) পেতে সহায়তা করে। আপনি বোঝেন যা অবজেক্ট বর্তমান ফাংশন মৃত্যুদন্ড কার্যকর হচ্ছে, তাহলে আপনি খুব সহজেই কি বর্তমান বুঝতে পারেন thisঅর্থাৎ

var val = "window.val"

var obj = {
    val: "obj.val",
    innerMethod: function () {
        var val = "obj.val.inner",
            func = function () {
                var self = this;
                return self.val;
            };

        return func;
    },
    outerMethod: function(){
        return this.val;
    }
};

//This actually gets executed inside window object 
console.log(obj.innerMethod()()); //returns window.val

//Breakdown in to 2 lines explains this in detail
var _inn = obj.innerMethod();
console.log(_inn()); //returns window.val

console.log(obj.outerMethod()); //returns obj.val

উপরে আমরা একই নাম 'ভাল' সহ 3 ভেরিয়েবল তৈরি করি। একটি বিশ্বব্যাপী প্রসঙ্গে, একটি অভ্যন্তরের অবজেক্ট এবং অন্যটি অভ্যন্তরের অভ্যন্তরের মেথড। জাভাস্ক্রিপ্ট স্থানীয় গো গ্লোবাল থেকে স্কোপ চেইনে গিয়ে নির্দিষ্ট প্রসঙ্গে শনাক্তকারীদের সমাধান করে।


কয়েকটি জায়গা যেখানে thisপার্থক্য করা যায়

কোনও বস্তুর একটি পদ্ধতি কল করা

var status = 1;
var helper = {
    status : 2,
    getStatus: function () {
        return this.status;
    }
};

var theStatus1 = helper.getStatus(); //line1
console.log(theStatus1); //2

var theStatus2 = helper.getStatus;
console.log(theStatus2()); //1

যখন লাইন 1 কার্যকর করা হয়, জাভাস্ক্রিপ্ট ফাংশন কলের জন্য একটি এক্সিকিউশন কনটেক্সট (ইসি) স্থাপন thisকরে, "" শেষের আগে যা কিছু এসেছিল তাকে রেফারেন্স করে the " । সুতরাং শেষ পংক্তিতে আপনি বুঝতে পারবেন a()যেটি বিশ্বব্যাপী প্রেক্ষাপটে কার্যকর হয়েছিল iswindow

কনস্ট্রাক্টর সহ

this তৈরি করা অবজেক্টটি উল্লেখ করতে ব্যবহার করা যেতে পারে

function Person(name){
    this.personName = name;
    this.sayHello = function(){
        return "Hello " + this.personName;
    }
}

var person1 = new Person('Scott');
console.log(person1.sayHello()); //Hello Scott

var person2 = new Person('Hugh');
var sayHelloP2 = person2.sayHello;
console.log(sayHelloP2()); //Hello undefined

যখন নতুন Person()কার্যকর করা হয়, সম্পূর্ণ নতুন অবজেক্ট তৈরি হয়। Personবলা হয় এবং তারthis সেই নতুন অবজেক্টের রেফারেন্সে সেট হয়।

ফাংশন কল

function testFunc() {
    this.name = "Name";
    this.myCustomAttribute = "Custom Attribute";
    return this;
}

var whatIsThis = testFunc();
console.log(whatIsThis); //window

var whatIsThis2 = new testFunc();
console.log(whatIsThis2);  //testFunc() / object

console.log(window.myCustomAttribute); //Custom Attribute 

যদি আমরা newকীওয়ার্ডটি মিস করি whatIsThisতবে এটি খুঁজে পেতে পারে এমন সবচেয়ে বৈশ্বিক প্রসঙ্গে রেফার করে (window )

ইভেন্ট হ্যান্ডলারদের সাথে

ইভেন্ট হ্যান্ডলার যদি ইনলাইন thisহয় তবে গ্লোবাল অবজেক্টকে বোঝায়

<script type="application/javascript">
    function click_handler() {
        alert(this); // alerts the window object
    }
</script>

<button id='thebutton' onclick='click_handler()'>Click me!</button>

জাভাস্ক্রিপ্টের মাধ্যমে ইভেন্ট হ্যান্ডলার যুক্ত করার সময়, ইভেন্টটি thisউত্পন্ন করে এমন DOM উপাদানকে বোঝায়।



5

"এটি" এর মান "প্রসঙ্গের" উপর নির্ভর করে যেখানে ফাংশনটি সম্পাদন করা হয়। প্রসঙ্গটি কোনও বস্তু বা বৈশ্বিক বস্তু, যেমন উইন্ডো হতে পারে।

সুতরাং "এটি" এর শব্দার্থক প্রচলিত ওওপি ভাষা থেকে পৃথক। এবং এটি সমস্যার সৃষ্টি করে: ১. যখন কোনও ফাংশন অন্য ভেরিয়েবলের কাছে পৌঁছে দেওয়া হয় (সম্ভবত, একটি কলব্যাক); এবং ২. যখন ক্লাসের সদস্য পদ্ধতি থেকে ক্লোজার আহ্বান করা হয়।

উভয় ক্ষেত্রেই, এটি উইন্ডোতে সেট করা আছে।


3

এই সাহায্য কার ? (জাভাস্ক্রিপ্টে 'এই' এর বেশিরভাগ বিভ্রান্তি এ থেকে আসে যে এটি সাধারণত আপনার বস্তুর সাথে সংযুক্ত নয়, তবে বর্তমান নির্বাহী সুযোগের সাথে - এটি ঠিক কীভাবে কাজ করে তা নাও হতে পারে তবে সর্বদা আমার কাছে মনে হয় - সম্পূর্ণ ব্যাখ্যার জন্য নিবন্ধটি দেখুন)


1
এটি " বর্তমান সম্পাদনের প্রসঙ্গে " যুক্ত হওয়া আরও ভাল হবে । ES6 (খসড়া) বাদে তীর ফাংশনগুলির সাথে পরিবর্তিত হয়, যেখানে এটি বহিরাগত সম্পাদনের প্রসঙ্গে সমাধান করা হয়।
রবজি

3

এই সম্পর্কে একটি সামান্য বিট তথ্য কীওয়ার্ড

আসুন thisকীওয়ার্ডটি লগ করি বিশ্বব্যাপী স্কোপগুলিতে আর কোনও কোড ছাড়াই কনসোলে log

console.log(this)

ইন ক্লায়েন্ট / ব্রাউজার this শব্দ একটি বিশ্বব্যাপী অবজেক্ট যাwindow

console.log(this === window) // true

এবং

ইন সার্ভার / নোড / জাভাস্ক্রিপ্ট রানটাইম this শব্দ এছাড়াও একটি বিশ্বব্যাপী অবজেক্ট যাmodule.exports

console.log(this === module.exports) // true
console.log(this === exports) // true

মনে রাখবেন exportsকেবল একটি রেফারেন্সmodule.exports


1

স্কোপের জন্য এই ব্যবহারটি ঠিক এর মতো

  <script type="text/javascript" language="javascript">
$('#tbleName tbody tr').each(function{
var txt='';
txt += $(this).find("td").eq(0).text();
\\same as above but synatx different
var txt1='';
 txt1+=$('#tbleName tbody tr').eq(0).text();
alert(txt1)
});
</script>

উপরের উদাহরণে txt1 এবং txt এর মান একই $ (এটি) = $ ('# tbleName tbody tr') একই


1

আমার একটা আলাদা গ্রহণ আছে this আশা করি যে সহায়ক জবাবদিহি করবে সেগুলি থেকে উত্তর আছে

জাভাস্ক্রিপ্ট দেখার জন্য একটি উপায় হল একটি ফাংশন 1 কল করার জন্য কেবল 1 টি উপায় রয়েছে তা দেখতে পারা । এটাই

functionObject.call(objectForThis, arg0, arg1, arg2, ...);

সবসময় সরবরাহ করা হয় কিছু মান objectForThis

অন্য সব কিছুই সিনট্যাকটিক চিনির জন্য functionObject.call

সুতরাং, সমস্ত কিছু কীভাবে এটি অনুবাদ করে তা বর্ণনা করা যায় functionObject.call

যদি আপনি কেবল কোনও ফাংশন কল করেন thisতবে "গ্লোবাল অবজেক্ট" যা ব্রাউজারে উইন্ডো

function foo() {
  console.log(this);
}

foo();  // this is the window object

অন্য কথায়,

foo();

কার্যকরভাবে অনুবাদ করা হয়েছিল

foo.call(window);

মনে রাখবেন যে আপনি যদি কঠোর মোড ব্যবহার করেন তবে thisতা হবেundefined

'use strict';

function foo() {
  console.log(this);
}

foo();  // this is the window object

যার অর্থ

অন্য কথায়,

foo();

কার্যকরভাবে অনুবাদ করা হয়েছিল

foo.call(undefined);

জাভাস্ক্রিপ্টে মত অপারেটার আছে +এবং -এবং *। এখানে ডট অপারেটরও রয়েছে.

.অপারেটর যখন ডান দিকে একটি ফাংশন এবং বাঁ দিকের একটি বস্তু সঙ্গে ব্যবহার কার্যকরভাবে মানে "পাস অবজেক্ট হিসেবেthis ফাংশনে।

উদাহরণ

const bar = {
  name: 'bar',
  foo() { 
    console.log(this); 
  },
};

bar.foo();  // this is bar

অন্য কথায় bar.foo()অনুবাদconst temp = bar.foo; temp.call(bar);

মনে রাখবেন যে ফাংশনটি কীভাবে তৈরি হয়েছিল (বেশিরভাগ ...) তা বিবেচ্য নয়। এই সমস্ত একই ফলাফল উত্পাদন করবে

const bar = {
  name: 'bar',
  fn1() { console.log(this); },
  fn2: function() { console.log(this); },
  fn3: otherFunction,
};

function otherFunction() { console.log(this) };

bar.fn1();  // this is bar
bar.fn2();  // this is bar
bar.fn3();  // this is bar

আবার এগুলি কেবল সিনট্যাকটিক চিনির জন্য

{ const temp = bar.fn1; temp.call(bar); }
{ const temp = bar.fn2; temp.call(bar); }
{ const temp = bar.fn3; temp.call(bar); }

অন্য একটি বলি হ'ল প্রোটোটাইপ চেইন। আপনি যখন a.bজাভাস্ক্রিপ্ট ব্যবহার করেন প্রথমে aসম্পত্তিটির জন্য সরাসরি রেফারেন্স করা বস্তুর দিকে নজর দেন b। যদি bঅবজেক্টে পাওয়া না যায় তবে জাভাস্ক্রিপ্ট অনুসন্ধানের জন্য অবজেক্টের প্রোটোটাইপটি দেখবে b

কোনও অবজেক্টের প্রোটোটাইপ সংজ্ঞায়িত করার বিভিন্ন উপায় রয়েছে, 2019 এর মধ্যে সবচেয়ে প্রচলিত শব্দটি মূলশব্দ class। উদ্দেশ্য thisযদিও এটি কোন ব্যাপার না। গুরুত্বপূর্ণ বিষয়টি হ'ল এটি যখন aসম্পত্তিটির জন্য বস্তুর দিকে নজর দেয় bতবে যদি এটি bকোনও বস্তুর উপর সম্পত্তি খুঁজে পায় বা এর প্রোটোটাইপ শৃঙ্খলে যদি bকোনও ফাংশন হয়ে যায় তবে উপরের মত একই বিধিগুলি প্রযোজ্য। ফাংশন bরেফারেন্সগুলি callমেথড ব্যবহার করে এবং aঅবজেক্টফোর হিসাবে পাস করার জন্য ডাকা হবে যা এই উত্তরের শীর্ষে দেখানো হয়েছে।

এখন। আসুন কল্পনা করুন আমরা একটি ফাংশন তৈরি করি যা স্পষ্টভাবে thisঅন্য ফাংশন কল করার আগে সেট করে এবং তারপরে .(ডট) অপারেটরের সাথে কল করে call

function foo() {
  console.log(this);
}

function bar() {
  const objectForThis = {name: 'moo'}
  foo.call(objectForThis);  // explicitly passing objectForThis
}

const obj = {
  bar,
};

obj.bar();  

অনুবাদ অনুসরণ করার পরে call, obj.bar()হয়ে যায় const temp = obj.bar; temp.call(obj);। আমরা যখন barফাংশনটি প্রবেশ করি তখন আমরা কল করি fooতবে আমরা স্পষ্টভাবে অবজেক্টফোর্ডের জন্য অন্য কোনও অবজেক্টে পাস করেছি সুতরাং যখন আমরা foo এ পৌঁছে যাইthis সেই অভ্যন্তরীণ বস্তু।

এটি উভয় bindএবং =>কার্যকারিতা কার্যকরভাবে করে। তারা আরও সিনট্যাকটিক চিনি হয়। তারা কার্যকরভাবে barউপরের মতো একটি নতুন অদৃশ্য ফাংশন তৈরি করে যা স্পষ্টভাবে সেট thisকরে যা কিছু নির্দিষ্ট করে ফাংশন সুনির্দিষ্টভাবে কল করার আগে সেট করে। বাইন্ডের ক্ষেত্রে thisআপনি যা যা করেন সেট করে সেট করা হয় bind

function foo() {
  console.log(this);
}

const bar = foo.bind({name: 'moo'});

// bind created a new invisible function that calls foo with the bound object.

bar();  

// the objectForThis we are passing to bar here is ignored because
// the invisible function that bind created will call foo with with
// the object we bound above

bar.call({name: 'other'});

মনে রাখবেন যে functionObject.bindউপস্থিত না থাকলে আমরা আমাদের নিজের মতো করে তৈরি করতে পারি

function bind(fn, objectForThis) {
  return function(...args) {
    return fn.call(objectForthis, ...args);
  };
}

এবং তারপরে আমরা এটিকে এটি কল করতে পারি

function foo() {
  console.log(this);
}

const bar = bind(foo, {name:'abc'});

তীর ফাংশন, =>অপারেটর বাইন্ডের জন্য সিনট্যাকটিক চিনি

const a = () => {console.log(this)};

হিসাবে একই

const tempFn = function() {console.log(this)}; 
const a = tempFn.bind(this);

ঠিক তেমনই bind, একটি নতুন অদৃশ্য ফাংশন তৈরি করা হয় যা প্রদত্ত ফাংশনটিকে একটি সীমাবদ্ধ মান হিসাবে কল করে objectForThisতবে bindবস্তুর সাথে আবদ্ধ হওয়া অসম্পূর্ণ is এটি thisযখনই ঘটে তখন যা হয়=>অপারেটরটি ব্যবহৃত হ'ল।

সুতরাং, ঠিক উপরের নিয়মগুলির মতো

const a = () => { console.log(this); }  // this is the global object
'use strict';
const a = () => { console.log(this); }  // this is undefined
function foo() {
  return () => { console.log(this); }
}

const obj = {
  foo,
};
const b = obj.foo();
b();

obj.foo()const temp = obj.foo; temp.call(obj);যার অর্থ অনুবাদ করে এর ভিতরে থাকা তীর অপারেটরটি একটি নতুন অদৃশ্য ফাংশনের fooসাথে আবদ্ধ হবে objএবং নির্ধারিত নতুন অদৃশ্য ফাংশনটি ফিরিয়ে দেবে bb()এটি সর্বদা যেমন কাজ করেছে b.call(window)বা তৈরি হয়েছে b.call(undefined)এমন নতুন অদৃশ্য ফাংশনটিকে কল করে foo। সেই অদৃশ্য ফাংশন এর মধ্যে পাসকে উপেক্ষা করে thisএবং পাস করেobj তীর ফাংশনে অবজেক্টফোটিস` হিসাবে করে।

উপরের কোডটি অনুবাদ করে

function foo() {
  function tempFn() {
    console.log(this);
  }
  return tempFn.bind(this);
}

const obj = {
  foo,
};
const b = obj.foo();
b.call(window or undefined if strict mode);

1apply অনুরূপ অন্য ফাংশনcall

functionName.apply(objectForThis, arrayOfArgs);

তবে ES6 হিসাবে ধারণাটি হিসাবে আপনি এমনকি এটি অনুবাদ করতে পারেন

functionName.call(objectForThis, ...arrayOfArgs);

0

সংক্ষিপ্তসার thisজাভাস্ক্রিপ্ট:

  • মানটি thisনির্ধারণ করা হয় কীভাবে ফাংশনটি চালিত হয় না, এটি কোথায় তৈরি হয়েছিল!
  • সাধারণত thisবিন্দুর বামে থাকা অবজেক্ট দ্বারা মান নির্ধারণ করা হয়। ( windowগ্লোবাল স্পেসে)
  • ইভেন্ট শ্রোতাদের মধ্যে this DOM উপাদানকে বোঝানো হয়েছে যার উপর ইভেন্টটি ডাকা হয়েছিল।
  • যখন ফাংশনটিতে newকীওয়ার্ড সহ ডাকা thisহয় তখন সদ্য তৈরি হওয়া অবজেক্টের মান বোঝায়
  • এর মানটি আপনি হেরফের করতে পারেন this ফাংশন সঙ্গে call, apply,bind

উদাহরণ:

let object = {
  prop1: function () {console.log(this);}
}

object.prop1();   // object is left of the dot, thus this is object

const myFunction = object.prop1 // We store the function in the variable myFunction

myFunction(); // Here we are in the global space
              // myFunction is a property on the global object
              // Therefore it logs the window object
              
             

ইভেন্ট শ্রোতার উদাহরণ:

document.querySelector('.foo').addEventListener('click', function () {
  console.log(this);   // This refers to the DOM element the eventListener was invoked from
})


document.querySelector('.foo').addEventListener('click', () => {
  console.log(this);  // Tip, es6 arrow function don't have their own binding to the this v
})                    // Therefore this will log the global object
.foo:hover {
  color: red;
  cursor: pointer;
}
<div class="foo">click me</div>

উদাহরণস্বরূপ নির্মাণকারী:

function Person (name) {
  this.name = name;
}

const me = new Person('Willem');
// When using the new keyword the this in the constructor function will refer to the newly created object

console.log(me.name); 
// Therefore, the name property was placed on the object created with new keyword.


0

"এটি" যথাযথভাবে বুঝতে হলে অবশ্যই তাদের মধ্যে প্রসঙ্গ এবং সুযোগ এবং পার্থক্য বুঝতে হবে।

সুযোগ : জাভাস্ক্রিপ্ট স্কোপটি ভেরিয়েবলের দৃশ্যমানতার সাথে সম্পর্কিত, ফাংশনটি ব্যবহারের মাধ্যমে স্কোপ অর্জন করে। (সুযোগ সম্পর্কে আরও পড়ুন)

প্রসঙ্গ : প্রসঙ্গটি বস্তুর সাথে সম্পর্কিত। এটি কোনও ফাংশন সম্পর্কিত অবজেক্টকে বোঝায়। আপনি যখন জাভাস্ক্রিপ্ট "এই" কীওয়ার্ডটি ব্যবহার করেন, এটি কোন ফাংশনের অন্তর্গত তা বোঝায়। উদাহরণস্বরূপ, কোনও ফাংশনের অভ্যন্তরে, আপনি যখন বলবেন: "this.accoutNumber", আপনি সেই বৈশিষ্ট্যটি "accoutNumber" উল্লেখ করছেন যা সেই ফাংশনটির সাথে সম্পর্কিত object

যদি "myObj" অবজেক্টটিতে "getMyName" নামে একটি পদ্ধতি থাকে, যখন জাভাস্ক্রিপ্ট কীওয়ার্ড "এটি" "getMyName" এর অভ্যন্তরে ব্যবহৃত হয়, এটি "myObj" বোঝায়। যদি "getMyName" ফাংশনটি বিশ্বব্যাপী সুযোগে সম্পাদিত হয়, তবে "এটি" উইন্ডো অবজেক্টকে বোঝায় (কঠোর মোড ব্যতীত)।

এখন কিছু উদাহরণ দেখুন:

    <script>
        console.log('What is this: '+this);
        console.log(this);
    </script>

ব্রাউজার আউটপুটটিতে রান্নিগ অ্যাববেভ কোডটি করবে: এখানে চিত্র বর্ণনা লিখুন

উইন্ডো অবজেক্টের প্রসঙ্গে আপনি যে আউটপুটটি রেখেছেন সে অনুযায়ী, এটিও দৃশ্যমান যে উইন্ডো প্রোটোটাইপ অবজেক্টকে বোঝায়।

এখন একটি ফাংশন ভিতরে চেষ্টা করুন:

    <script>
        function myFunc(){
            console.log('What is this: '+this);
            console.log(this);
        }
        myFunc();
    </script>

আউটপুট:

এখানে চিত্র বর্ণনা লিখুন আউটপুটটি একই কারণ আমরা বৈশ্বিক স্কোপগুলিতে 'এই' পরিবর্তনশীলটিকে লগইন করেছি এবং আমরা এটি কার্যকরী স্কোপে লগ করেছি, আমরা প্রসঙ্গটি পরিবর্তন করি নি। উভয় ক্ষেত্রে প্রসঙ্গটি একই ছিল, বিধবা অবজেক্টের সাথে সম্পর্কিত ।

এখন আসুন আমাদের নিজস্ব অবজেক্ট তৈরি করা যাক। জাভাস্ক্রিপ্টে, আপনি বিভিন্ন উপায়ে একটি অবজেক্ট তৈরি করতে পারেন।

 <script>
        var firstName = "Nora";
        var lastName = "Zaman";
        var myObj = {
            firstName:"Lord",
            lastName:'Baron',
            printNameGetContext:function(){
                console.log(firstName + " "+lastName);
                console.log(this.firstName +" "+this.lastName);
                return this;
            }
        }

      var context = myObj.printNameGetContext();
      console.log(context);
    </script>

আউটপুট: এখানে চিত্র বর্ণনা লিখুন

সুতরাং উপরের উদাহরণ থেকে আমরা দেখতে পেলাম যে 'এই' কীওয়ার্ডটি একটি নতুন প্রসঙ্গকে নির্দেশ করছে যা মওবজ সম্পর্কিত, এবং মাইওজেক্টে অবজেক্টে প্রোটোটাইপ চেইনও রয়েছে।

এর অন্য একটি উদাহরণ নিক্ষেপ করা যাক:

<body>
    <button class="btn">Click Me</button>
    <script>
        function printMe(){
            //Terminal2: this function declared inside window context so this function belongs to the window object.
            console.log(this);
        }
        document.querySelector('.btn').addEventListener('click', function(){
            //Terminal1: button context, this callback function belongs to DOM element 
            console.log(this);
            printMe();
        })
    </script>
</body>

আউটপুট: বুদ্ধি ঠিক আছে? (মন্তব্য পড়ুন) এখানে চিত্র বর্ণনা লিখুন

উপরের উদাহরণটি বুঝতে আপনার যদি সমস্যা হয় তবে আসুন আমরা আমাদের নিজস্ব কলব্যাক দিয়ে চেষ্টা করি;

<script>
        var myObj = {
            firstName:"Lord",
            lastName:'Baron',
            printName:function(callback1, callback2){
                //Attaching callback1 with this myObj context
                this.callback1 = callback1;
                this.callback1(this.firstName +" "+this.lastName)
                //We did not attached callback2 with myObj so, it's reamin with window context by default
                callback2();
                /*
                 //test bellow codes
                 this.callback2 = callback2;
                 this.callback2();
                */
            }
        }
        var callback2 = function (){
            console.log(this);
        }
        myObj.printName(function(data){
            console.log(data);
            console.log(this);
        }, callback2);
    </script>

আউটপুট: এখানে চিত্র বর্ণনা লিখুন

এখন আসুন স্কোপ, স্ব, আইফোন এবং এটি কীভাবে আচরণ করে তা বুঝতে পারি

       var color = 'red'; // property of window
       var obj = {
           color:'blue', // property of window
           printColor: function(){ // property of obj, attached with obj
               var self = this;
               console.log('In printColor -- this.color: '+this.color);
               console.log('In printColor -- self.color: '+self.color);
               (function(){ // decleard inside of printColor but not property of object, it will executed on window context.
                    console.log(this)
                    console.log('In IIFE -- this.color: '+this.color);
                    console.log('In IIFE -- self.color: '+self.color); 
               })();

               function nestedFunc(){// decleard inside of printColor but not property of object, it will executed on window context.
                    console.log('nested fun -- this.color: '+this.color);
                    console.log('nested fun -- self.color: '+self.color);
               }

               nestedFunc(); // executed on window context
               return nestedFunc;
           }
       };

       obj.printColor()(); // returned function executed on window context
   </script> 

আউটপুট বেশ দুর্দান্ত? এখানে চিত্র বর্ণনা লিখুন


-1

সহজ উত্তর:

"এই" কীওয়ার্ডটি সর্বদা আমন্ত্রণের প্রসঙ্গে নির্ভরশীল। তারা নীচে উল্লেখ করা হয়।

  1. ফাংশনটি নতুন কীওয়ার্ড সহ বলা হয়

    যদি ফাংশনটি নতুন কীওয়ার্ডের সাথে ডাকা হয় তবে এটি নতুন তৈরি করা অবজেক্টের সাথে আবদ্ধ হবে।

    function Car(){
      this.name="BMW";
    }
    const myCar=new Car();
    myCar.name; // output "BMW"

    উপরের দিকে এটি 'মাইকার' অবজেক্টে আবদ্ধ হবে

  2. ফাংশনটি বিশেষভাবে কল এবং প্রয়োগের পদ্ধতিগুলি কল করা হয়।

    এই ক্ষেত্রে, এটি অবজেক্টের সাথে আবদ্ধ হবে যা স্পষ্টভাবে ফাংশনে প্রেরণ করা হবে।

    var obj1={"name":"bond"};
    function printMessage(msg){
        return msg+" "+this.name;
    }
    const message=printMessage.call(obj1,"my name is ");
    console.log(message); //HERE THIS WILL BE BOUND TO obj1 WHICH WE PASSED EXPLICITLY. SAME FOR APPLY METHOD ALSO.
  3. যদি ফাংশনটিকে উদ্দেশ্যমূলকভাবে ডাকা হয় তবে তা অসম্পূর্ণভাবে আবশ্যক তবে এটি এই উদ্দেশ্যটির সাথে আবদ্ধ হবে

    var obj1={
       "name":"bond",
        getName: function () {
                    return this.name;
                 }
    };
    const newname=obj1.getName();
    console.log(newname); //HERE THIS WILL BE BOUND TO obj1(WHITCHEVER OBJECT IS MENTIONED BEFORE THE DOT THIS WILL BE BOUND TO THAT)
  4. যখন ফাংশনটি কোনও বিষয়বস্তু ছাড়া বলা হয়, তখন এটি বিশ্বব্যাপী উদ্দেশ্য হতে পারে

    const util = {
       name: 'Utility',
       getName: function () {
                    return this.name;
    };
    
    const getName=util.getName;
    const newName=getName();
    console.log(newName); // IF THIS EXECUTED IN BROWSER THIS WILL BE  BOUND TO WINDOW OBJECT. IF THIS EXECUTED IN SERVER THIS WILL BE BOUND TO GLOBAL OBJECT
  5. কঠোর মোডে এটি বর্ণিত হবে

    function setName(name){
        "use strict"
        return this.name;
    }
    setName(); //WILL BE ERROR SAYING name IS UNDEFINED. 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.