ඔබ දැනගත යුතු දේ this
this
(aka "සන්දර්භය") යනු එක් එක් ශ්රිතය තුළ ඇති විශේෂ මූල පදයක් වන අතර එහි වටිනාකම රඳා පවතින්නේ ශ්රිතය හැඳින්වූ ආකාරය මත මිස එය අර්ථ දැක්වූයේ කෙසේද / කවදාද යන්න මත නොවේ. වෙනත් විචල්යයන් මෙන් ශබ්දකෝෂ විෂය පථයන්ට එය බලපාන්නේ නැත (ඊතල ශ්රිත හැර, පහත බලන්න). මෙන්න උදාහරණ කිහිපයක්:
function foo() {
console.log(this);
}
// normal function call
foo(); // `this` will refer to `window`
// as object method
var obj = {bar: foo};
obj.bar(); // `this` will refer to `obj`
// as constructor function
new foo(); // `this` will refer to an object that inherits from `foo.prototype`
පිළිබඳ වැඩිදුර දැන ගැනීමට this
, MDN ප්රලේඛනය දෙස බලන්න .
නිවැරදි දේ වෙත යොමු වන්නේ කෙසේද this
භාවිතා නොකරන්න this
ඔබට ඇත්ත වශයෙන්ම ප්රවේශ වීමට අවශ්ය නැත this
, නමුත් එය යොමු කරන වස්තුව . පහසු විසඳුමක් වන්නේ එම වස්තුවට යොමු වන නව විචල්යයක් නිර්මාණය කිරීමයි. විචල්යයට ඕනෑම නමක් තිබිය හැකි නමුත් පොදු ඒවා self
සහ that
.
function MyConstructor(data, transport) {
this.data = data;
var self = this;
transport.on('data', function() {
alert(self.data);
});
}
සිට self
සාමාන්ය විචල්ය වේ, එය lexical පරාසය නීති පිළිපදින හා callback ඇතුළත ලබාගත හැකි ය. this
ඇමතුම් ලබා ගැනීමේ වටිනාකම ඔබටම ලබා ගත හැකි වාසියද මෙයයි .
නැවත ඇමතුම පැහැදිලිව සකසා this
ඇත - 1 කොටස
this
එහි වටිනාකම ස්වයංක්රීයව සකසා ඇති නිසා ඔබට එහි වටිනාකම පාලනය කළ නොහැකි බව පෙනේ, නමුත් ඇත්ත වශයෙන්ම එය එසේ නොවේ.
සෑම ශ්රිතයකටම .bind
[docs] ක්රමය ඇත , එය this
අගයකට බැඳී නව ශ්රිතයක් ලබා දෙයි. මෙම ක්රියාව මඟින් ඔබට නම් එකක් ලෙස හරියටම එම චර්යාවක් .bind
මත පමණක්, this
ඔබ විසින් සකස් කරන ලදී. එම ශ්රිතය කෙසේ හෝ කවදා හැඳින්වුවද, this
සෑම විටම සම්මත අගය වෙත යොමු වේ.
function MyConstructor(data, transport) {
this.data = data;
var boundFunction = (function() { // parenthesis are not necessary
alert(this.data); // but might improve readability
}).bind(this); // <- here we are calling `.bind()`
transport.on('data', boundFunction);
}
මෙම අවස්ථාවේ දී, අපි ඇමතුම් ආපසු this
ලබා දෙන්නේ එහි වටිනාකමට MyConstructor
ය this
.
සටහන: jQuery සඳහා සන්දර්භය බන්ධනය කිරීමේදී, ඒ වෙනුවට jQuery.proxy
[docs] භාවිතා කරන්න. මෙය කිරීමට හේතුව, සිදුවීම් ඇමතුමක් ආපසු ලබා ගැනීමේදී ඔබට ශ්රිතය පිළිබඳ සඳහනක් ගබඩා කිරීමට අවශ්ය නොවන බැවිනි. jQuery එය අභ්යන්තරව හසුරුවයි.
ECMAScript 6: ඊතල ශ්රිත භාවිතා කරන්න
ECMAScript 6 ඊතල ශ්රිත හඳුන්වා දෙයි , එය ලැම්බඩා ශ්රිත ලෙස සිතිය හැකිය. ඔවුන්ට ඔවුන්ගේම this
බැඳීමක් නොමැත. ඒ වෙනුවට, this
සාමාන්ය විචල්යයක් මෙන් විෂය පථය දෙස බලයි. ඒ කියන්නේ ඔබට ඇමතිය යුතු නැත .bind
. ඔවුන් සතුව ඇති එකම විශේෂ හැසිරීම එය නොවේ, කරුණාකර වැඩි විස්තර සඳහා MDN ප්රලේඛනය බලන්න.
function MyConstructor(data, transport) {
this.data = data;
transport.on('data', () => alert(this.data));
}
this
ඇමතුම් ලබා ගැනීමේ කට්ටලය - 2 කොටස
ඇමතුම් ආපසු භාරගන්නා සමහර කාර්යයන් / ක්රම මගින් ඇමතුම් ලබා ගත යුතු අගයක් ද පිළිගනී this
. මෙය මූලිකවම එය ඔබම බැඳ තැබීම හා සමාන වේ, නමුත් ශ්රිතය / ක්රමය එය ඔබ වෙනුවෙන් කරයි. Array#map
[docs] එවැනි ක්රමයකි. එහි අත්සන:
array.map(callback[, thisArg])
පළමු තර්කය ඇමතුම වන අතර දෙවන තර්කය වන්නේ අගය this
යොමු විය යුතුය. මෙන්න විවාදාත්මක උදාහරණයක්:
var arr = [1, 2, 3];
var obj = {multiplier: 42};
var new_arr = arr.map(function(v) {
return v * this.multiplier;
}, obj); // <- here we are passing `obj` as second argument
සටහන: ඔබට වටිනාකමක් ලබා දිය හැකිද නැද්ද යන්න this
සාමාන්යයෙන් එම ශ්රිතයේ / ක්රමයේ ලේඛනවල සඳහන් වේ. උදාහරණයක් ලෙස, jQuery හි $.ajax
ක්රමය [docs] පහත දැක්වෙන විකල්පය විස්තර කරයි context
:
මෙම වස්තුව අජැක්ස් සම්බන්ධ සියලු ඇමතුම් වල සන්දර්භය බවට පත් කරනු ඇත.
පොදු ගැටළුව: වස්තු ක්රම ඇමතුම් / සිදුවීම් හසුරුවන්නන් ලෙස භාවිතා කිරීම
මෙම ගැටළුවේ තවත් පොදු ප්රකාශනයක් වන්නේ වස්තු ක්රමයක් ඇමතුම් / සිදුවීම් හසුරුවන්නා ලෙස භාවිතා කිරීමයි. කාර්යයන් ජාවාස්ක්රිප්ට් හි පළමු පන්තියේ පුරවැසියන් වන අතර “ක්රමය” යන පදය වස්තු දේපලක වටිනාකම වන ශ්රිතයක් සඳහා වූ වාචික යෙදුමකි. නමුත් එම ශ්රිතයට එහි “අඩංගු” වස්තුවට නිශ්චිත සම්බන්ධයක් නොමැත.
පහත උදාහරණය සලකා බලන්න:
function Foo() {
this.data = 42,
document.body.onclick = this.method;
}
Foo.prototype.method = function() {
console.log(this.data);
};
ශ්රිතය this.method
ක්ලික් සිදුවීම් හසුරුවන්නා ලෙස පවරා ඇත, නමුත් document.body
එය ක්ලික් කළහොත් , ලොග් වූ අගය වනුයේ undefined
, සිදුවීම් හසුරුවන්නා තුළ, this
යොමු දැක්වෙන්නේ document.body
මිස උදාහරණය නොවේ Foo
.
ආරම්භයේ දැනටමත් සඳහන් කර ඇති පරිදි, this
යොමු දක්වන්නේ ශ්රිතය හැඳින්වෙන ආකාරය මත මිස එය නිර්වචනය කර ඇති ආකාරය මත නොවේ .
කේතය පහත පරිදි වූවා නම්, ශ්රිතයට වස්තුවට ව්යංග යොමු කිරීමක් නොමැති බව වඩාත් පැහැදිලිව පෙනේ:
function method() {
console.log(this.data);
}
function Foo() {
this.data = 42,
document.body.onclick = this.method;
}
Foo.prototype.method = method;
විසඳුම ඉහත සඳහන් කළ ආකාරයටම වේ: තිබේ නම්, නිශ්චිත අගයකට .bind
පැහැදිලිවම බැඳීමට භාවිතා කරන්නthis
document.body.onclick = this.method.bind(this);
හෝ නිර්නාමික ශ්රිතයක් ඇමතුම් / සිදුවීම් හසුරුවන්නා ලෙස භාවිතා කිරීමෙන් වස්තුවෙහි “ක්රමයක්” ලෙස පැහැදිලිව අමතන්න සහ වස්තුව ( this
) වෙනත් විචල්යයකට පවරන්න :
var self = this;
document.body.onclick = function() {
self.method();
};
හෝ ඊතල ශ්රිතයක් භාවිතා කරන්න:
document.body.onclick = () => this.method();