একটি জাভাস্ক্রিপ্ট ফাইলে আমি দেখেছি:
function Somefunction(){
var that = this;
...
}
এটি এটিকে ঘোষণা করার that
এবং নির্ধারণের উদ্দেশ্য কী this
?
একটি জাভাস্ক্রিপ্ট ফাইলে আমি দেখেছি:
function Somefunction(){
var that = this;
...
}
এটি এটিকে ঘোষণা করার that
এবং নির্ধারণের উদ্দেশ্য কী this
?
উত্তর:
আমি একটি উত্তর দিয়ে এই উত্তরটি শুরু করতে যাচ্ছি:
var colours = ['red', 'green', 'blue'];
document.getElementById('element').addEventListener('click', function() {
// this is a reference to the element clicked on
var that = this;
colours.forEach(function() {
// this is undefined
// that is a reference to the element clicked on
});
});
আমার উত্তরটি মূলত jQuery দিয়ে এটি প্রদর্শিত হয়েছিল, যা কেবল খুব সামান্য ভিন্ন:
$('#element').click(function(){
// this is a reference to the element clicked on
var that = this;
$('.elements').each(function(){
// this is a reference to the current element in the loop
// that is still a reference to the element clicked on
});
});
কারণ this
প্রায়শই পরিবর্তন হয় যখন আপনি নতুন ফাংশন কল করে সুযোগ পরিবর্তন করেন, আপনি এটি ব্যবহার করে মূল মানটি অ্যাক্সেস করতে পারবেন না। এটিকে সামঞ্জস্য করা that
আপনাকে এখনও এর মূল মানটি অ্যাক্সেস করার অনুমতি দেয় this
।
ব্যক্তিগতভাবে, আমি that
উপন্যাস হিসাবে ব্যবহার অপছন্দ করি । এটি কী উল্লেখ করছে এটি খুব কমই স্পষ্ট, বিশেষত যদি ফাংশনগুলি কয়েক লাইনের চেয়ে দীর্ঘ হয়। আমি সবসময় আরও বর্ণনামূলক ওরফে ব্যবহার করি । উপরে আমার উদাহরণ, আমি সম্ভবত ব্যবহার করতে চাই clickedEl
।
var self = this;
। শব্দটি that
ভেরিয়েবলকে বোঝায় বলে মনে হচ্ছে তবে এটিই কিন্তু কিছু নয় this
।
forEach
ফাংশন একটি দ্বিতীয় ঐচ্ছিক যুক্তি যা ফাংশনের অবিচল লাগে। colours.forEach(function(){/* 'this' is bound correctly --> */}, this);
সুতরাং একটি নোট যুক্ত করা উচিত যা এর সাথে আসলে প্রয়োজন var that = this
হয় না । forEach
ক্রকফোর্ড থেকে
কনভেনশন দ্বারা, আমরা একটি বেসরকারী যে পরিবর্তনশীল। এটি ব্যক্তিগত পদ্ধতিতে অবজেক্টটি উপলব্ধ করতে ব্যবহৃত হয়। এটি ECMAScript ভাষা নির্দিষ্টকরণের জন্য একটি ত্রুটির জন্য কাজ করে যা এটি অভ্যন্তরীণ ফাংশনগুলির জন্য এটি ভুলভাবে সেট করে দেয়।
function usesThis(name) {
this.myName = name;
function returnMe() {
return this; //scope is lost because of the inner function
}
return {
returnMe : returnMe
}
}
function usesThat(name) {
var that = this;
this.myName = name;
function returnMe() {
return that; //scope is baked in with 'that' to the "class"
}
return {
returnMe : returnMe
}
}
var usesthat = new usesThat('Dave');
var usesthis = new usesThis('John');
alert("UsesThat thinks it's called " + usesthat.returnMe().myName + '\r\n' +
"UsesThis thinks it's called " + usesthis.returnMe().myName);
এই সতর্কতাগুলি ...
ইউজস এটি মনে করে একে ডেভ বলা হয়
ব্যবহারসমূহ এটি মনে করে এটিকে অপরিজ্ঞাত বলা হয়
that
তার উদাহরণটি ভেরিয়েবল মোটেও ব্যবহৃত হয় না। এটি এটিকে দেখতে this
এমনভাবে দেখায় যে কেবল একটি ভেরিয়েবল হোল্ডিং তৈরি করা কোডের বাকী কিছু কাজ করে।
অভ্যন্তরীণ ফাংশনগুলি (অন্যান্য ফাংশনগুলির মধ্যে সংজ্ঞায়িত ফাংশনগুলি) তাদের মতো করে কাজ করার জন্য এটি একটি হ্যাক। জাভাস্ক্রিপ্টে আপনি যখন অন্যটির ভিতরে একটি ফাংশন সংজ্ঞায়িত করেন তখন this
স্বয়ংক্রিয়ভাবে বৈশ্বিক সুযোগে সেট হয়ে যায়। এটি বিভ্রান্তিকর হতে পারে কারণ আপনি this
যেমন বহিরাগত ফাংশন হিসাবে একই মান আশা করেন ।
var car = {};
car.starter = {};
car.start = function(){
var that = this;
// you can access car.starter inside this method with 'this'
this.starter.active = false;
var activateStarter = function(){
// 'this' now points to the global scope
// 'this.starter' is undefined, so we use 'that' instead.
that.starter.active = true;
// you could also use car.starter, but using 'that' gives
// us more consistency and flexibility
};
activateStarter();
};
এটি বিশেষত সমস্যা যখন আপনি কোনও অবজেক্টের পদ্ধতি হিসাবে car.start
উদাহরণ তৈরি করেন ( উদাহরণস্বরূপ) তারপরে সেই পদ্ধতির অভ্যন্তরে কোনও ফাংশন তৈরি করুন (যেমন activateStarter
)। শীর্ষ স্তরের পদ্ধতিতে this
বস্তুটির দিকে নির্দেশ করে এটি একটি পদ্ধতি (এই ক্ষেত্রে, car
) তবে অভ্যন্তরীণ কার্যক্রমে this
এখন বৈশ্বিক সুযোগকে নির্দেশ করে। এটি একটি ব্যথা।
উভয় স্কোপে কনভেনশন দ্বারা ব্যবহারের জন্য একটি ভেরিয়েবল তৈরি করা জাভাস্ক্রিপ্টের সাথে এই খুব সাধারণ সমস্যার সমাধান (যদিও এটি jquery ফাংশনেও কার্যকর)। এই কারণেই খুব সাধারণ শোনার নাম that
ব্যবহৃত হয়। এটি ভাষার কোনও অভাবকে কাটিয়ে ওঠার জন্য একটি সহজেই স্বীকৃত কনভেনশন।
ডগলাস ক্রকফোর্ডে এল রোনোকোর ইঙ্গিতের মতো এটিও একটি ভাল ধারণা।
ব্যবহারের that
সত্যিই প্রয়োজনীয় যদি আপনি ব্যবহার একটি ওয়ার্কঅ্যারাউন্ড করা নয় call()
বা apply()
:
var car = {};
car.starter = {};
car.start = function(){
this.starter.active = false;
var activateStarter = function(){
// 'this' now points to our main object
this.starter.active = true;
};
activateStarter.apply(this);
};
কখনও কখনও this
অন্য স্কোপ এবং অন্য কিছু উল্লেখ করতে পারে, উদাহরণস্বরূপ ধরুন আপনি কোনও ডিওএম ইভেন্টের ভিতরে কনস্ট্রাক্টর পদ্ধতিটি কল করতে চান, এই ক্ষেত্রে this
DOM উপাদানটিকে তৈরি করা অবজেক্ট নয় refer
এইচটিএমএল
<button id="button">Alert Name</button>
জাতীয়
var Person = function(name) {
this.name = name;
var that = this;
this.sayHi = function() {
alert(that.name);
};
};
var ahmad = new Person('Ahmad');
var element = document.getElementById('button');
element.addEventListener('click', ahmad.sayHi); // => Ahmad
ইচ্ছা অ্যাসিং উপরে সমাধান this
করতে that
তারপর আমরা করতে পারেন এবং ভিতরে নাম সম্পত্তি এক্সেস sayHi
থেকে পদ্ধতি that
, এই এত করে DOM কল ভিতরে বিষয় ছাড়া বলা যায় না।
আরেকটি সমাধান হ'ল একটি ফাঁকা that
বস্তু বরাদ্দ করা এবং এতে বৈশিষ্ট্য এবং পদ্ধতি যুক্ত করা এবং তারপরে এটি ফেরত দেওয়া। কিন্তু এই সমাধানের সাহায্যে আপনি prototype
কনস্ট্রাক্টরের হারিয়েছেন ।
var Person = function(name) {
var that = {};
that.name = name;
that.sayHi = function() {
alert(that.name);
};
return that;
};
এখানে একটি উদাহরণ `
$(document).ready(function() {
var lastItem = null;
$(".our-work-group > p > a").click(function(e) {
e.preventDefault();
var item = $(this).html(); //Here value of "this" is ".our-work-group > p > a"
if (item == lastItem) {
lastItem = null;
$('.our-work-single-page').show();
} else {
lastItem = item;
$('.our-work-single-page').each(function() {
var imgAlt = $(this).find('img').attr('alt'); //Here value of "this" is '.our-work-single-page'.
if (imgAlt != item) {
$(this).hide();
} else {
$(this).show();
}
});
}
});
});`
সুতরাং আপনি দেখতে পাচ্ছেন যে ডিওএম এলিমেন্টটি আপনি লক্ষ্য করে তার উপর নির্ভর করে এর মান দুটি পৃথক মান রয়েছে তবে আপনি উপরের কোডটিতে "যে" যুক্ত করার পরে আপনি "এই" এর লক্ষ্য পরিবর্তন করছেন change
`$(document).ready(function() {
var lastItem = null;
$(".our-work-group > p > a").click(function(e) {
e.preventDefault();
var item = $(this).html(); //Here value of "this" is ".our-work-group > p > a"
if (item == lastItem) {
lastItem = null;
var that = this;
$('.our-work-single-page').show();
} else {
lastItem = item;
$('.our-work-single-page').each(function() {
***$(that).css("background-color", "#ffe700");*** //Here value of "that" is ".our-work-group > p > a"....
var imgAlt = $(this).find('img').attr('alt');
if (imgAlt != item) {
$(this).hide();
} else {
$(this).show();
}
});
}
});
});`
..... $ (যে) .সিএসএস ("পটভূমির রঙ", "# ffe700"); // এখানে "যে" এর মান ".আর-কর্ম-গোষ্ঠী> পি> এ" কারণ ভের মান = এটি; সুতরাং যদিও আমরা "এই" = '। আমাদের কর্ম-একক পৃষ্ঠায়' আছি, তবুও আমরা "ডিওএমটি" ব্যবহার করতে পারি আগের ডিওএম উপাদানটি ব্যবহার করার জন্য ulate