ජාවාස්ක්රිප්ට් this
සරල ශ්රිත ආයාචනය
පහත සඳහන් කාර්යය සලකා බලන්න:
function foo() {
console.log("bar");
console.log(this);
}
foo(); // calling the function
අපි මෙය සාමාන්ය ප්රකාරයේදී ක්රියාත්මක කරන බව සලකන්න, එනම් දැඩි ප්රකාරය භාවිතා නොවේ.
බ්රව්සරයක ධාවනය වන විට, එහි අගය මෙසේ this
සටහන් වේ window
. එයට හේතුව window
වෙබ් බ්රව්සරයේ විෂය පථයේ ගෝලීය විචල්යයයි.
ඔබ මෙම කේතයම node.js වැනි පරිසරයක ධාවනය කරන්නේ නම්, this
ඔබගේ යෙදුමේ ගෝලීය විචල්යය වෙත යොමු වේ.
දැන් අපි මෙය "use strict";
ශ්රිත ප්රකාශයේ ආරම්භයට ප්රකාශය එකතු කරමින් දැඩි ආකාරයකින් ක්රියාත්මක කරන්නේ නම් , this
තවදුරටත් පරිසර දෙකෙහිම ගෝලීය විචල්යය වෙත යොමු නොවනු ඇත. දැඩි ආකාරයකින් ව්යාකූලතා වළක්වා ගැනීම සඳහා මෙය සිදු කෙරේ. this
මේ අවස්ථාවේ දී පමණක් ලොග් වනු ඇත undefined
, මන්ද එය එයයි, එය අර්ථ දක්වා නැත.
පහත දැක්වෙන අවස්ථා වලදී, වටිනාකම හැසිරවිය යුතු ආකාරය අපි බලමු this
.
වස්තුවක් මත ශ්රිතයක් කැඳවීම
මෙය කිරීමට විවිධ ක්රම තිබේ. ඔබ ජාවාස්ක්රිප්ට් හි ස්වදේශික ක්රමවේදයන් කැඳවා තිබේ නම් forEach
සහ එම අවස්ථාවෙහි විචල්යය ඔබ එම ශ්රිතය හැඳින්වූ ආකාරය වෙත යොමු වන බව slice
ඔබ දැනටමත් දැන සිටිය යුතුය (ජාවාස්ක්රිප්ට් හි සෑම දෙයක්ම s හා s ද ඇතුළුව ). උදාහරණයක් ලෙස පහත කේතය ගන්න.this
Object
Object
Array
Function
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
මූලික පදය භාවිතා කරන විට කුමක් සිදුවේ දැයි බලමු .
new
මූල පදය සමඟ ශ්රිතය ඇමතීමෙන් වහාම Object
වර්ගයක් ආරම්භ වේ Person
.
- මෙහි ඉදිකිරීම්කරුට
Object
එහි ඉදිකිරීම්කරු සකසා ඇත Person
. එසේම, typeof awal
එය නැවත පැමිණෙන බව සලකන්න Object
.
- මෙම
Object
නවයට මූලාකෘතිය පවරනු ලැබේ Person.prototype
. මෙයින් අදහස් කරන්නේ Person
මූලාකෘතියේ ඇති ඕනෑම ක්රමයක් හෝ දේපලක් Person
ඇතුළුව සියලු අවස්ථාවන් සඳහා ලබා ගත හැකි බවයි awal
.
- ශ්රිතය
Person
දැන්ම ක්රියාත්මක වේ; this
අලුතින් ඉදිකරන ලද වස්තුව පිළිබඳ සඳහනක් වීම awal
.
හරිම සරලයි නේද?
නිල ECMAScript පිරිවිතරයේ එවැනි ආකාරයේ ශ්රිත සත්ය constructor
ශ්රිත බව කොතැනකවත් සඳහන් නොවන බව සලකන්න . ඒවා සාමාන්ය කාර්යයන් පමණක් new
වන අතර ඕනෑම ශ්රිතයක් සඳහා භාවිතා කළ හැකිය. එය අප ඒවා ලෙස භාවිතා කිරීම පමණක් වන අතර, එබැවින් අපි ඒවා හඳුන්වන්නේ එවැනි අය ලෙස පමණි.
කාර්යයන් මත ඇමතුම් කාර්යයන්: call
සහapply
ඔව්, function
s ද 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
. දක්ෂයි නේද?
දර්ශකය:
this
පෙරනිමියෙන් පවත්වන්නේ කුමක්ද?
- අපි ශ්රිතය Object-dot අංකනය සහිත ක්රමයක් ලෙස හැඳින්වුවහොත් කුමක් කළ යුතුද?
- අපි
new
මූලික පදය භාවිතා කරන්නේ නම් කුමක් කළ යුතුද ?
- අපි කොහොමද හැසිරවීමට නැහැ
this
සමග call
හා apply
?
- භාවිතා කිරීම
bind
.
this
කැදැලි-විෂය පථයේ ගැටළු විසඳීම සඳහා පිටපත් කිරීම .