“මෙම” මූල පදය ක්‍රියාත්මක වන්නේ කෙසේද?


1320

thisස්ටැක් පිටාර ගැලීමේ වෙබ් අඩවියේ ජාවාස්ක්‍රිප්ට් හි මූලික පදය කුමක්ද සහ එය නිවැරදිව (සහ වැරදි ලෙස) භාවිතා කරන්නේ කෙසේද යන්න පිළිබඳ පැහැදිලි පැහැදිලි කිරීමක් නොපෙනෙන බව මම දුටුවෙමි .

මම එය සමඟ ඉතා අමුතු හැසිරීමක් දැක ඇති අතර එය සිදුවීමට හේතුව තේරුම් ගැනීමට අපොහොසත් වී ඇත.

thisවැඩ කරන්නේ කෙසේද සහ එය භාවිතා කළ යුත්තේ කවදාද?


6
මම මෙය සොයාගත්තේ "මේ" quirksmode.org/js/this.html
Wai Wong



1
මෙම MDN දළ විශ්ලේෂණය අර්ධ නරක නැහැ ... developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/...
ඩැට්

2
thisමූලපදය පිළිබඳ සිත්ගන්නා පැහැදිලි කිරීමක් : rainsoft.io/gentle-explanation-of-this-in-javascript
දිමිත්‍රි පව්ලුටින්

Answers:


1360

මම කියවීමට නිර්දේශ මයික් බටහිර ගේ ලිපිය JavaScript දී විෂය පථය ( කැඩපත ) පළමු. එය thisජාවාස්ක්‍රිප්ට් හි සංකල්ප සහ විෂය පථ දාමයන් සඳහා විශිෂ්ට, මිත්‍රශීලී හැඳින්වීමකි .

ඔබ පුරුදු වීමට පටන් ගත් පසු this, නීති ඇත්තෙන්ම සරල ය. මෙම සම්මතයන් 5.1 සම්මත අර්ථ දක්වන්නේ this:

§11.1.1 මෙම thisමූල පදය

මෙම thisවර්තමාන ක්රියාත්මක සන්දර්භය පිළිබඳ ThisBinding වටිනා ඉඟි පද ඇගයීමට

මෙම බන්ධනය යනු ජාවාස්ක්‍රිප්ට් පරිවර්තකය විසින් ජාවාස්ක්‍රිප්ට් කේතය තක්සේරු කරන විට නඩත්තු කරන දෙයක් වන අතර එය විශේෂ CPU ​​ලේඛනයක් වැනි වස්තුවකට යොමු කිරීමක් දරයි. විවිධ අවස්ථා තුනෙන් එකක ක්‍රියාත්මක කිරීමේ සන්දර්භයක් ස්ථාපිත කරන සෑම අවස්ථාවකම පරිවර්තකයා මෙම බන්ධනය යාවත්කාලීන කරයි:

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 ).

2. eval කේතය ඇතුළත් කිරීම

  • … මෙම eval() බන්ධනයට සෘජු ඇමතුමකින් නොවෙනස්ව පවතී; එය ඇමතුම් ක්‍රියාත්මක කිරීමේ සන්දර්භය ( §10.4.2 (2) (අ)) හි මෙම බන්ධනයට සමාන අගයකි .

  • ... කිරීමට සෘජුවම විසින් නොවේ නම් eval()
    ThisBinding ගෝලීය වස්තුවකට සමූහයක් වේ නම් ආරම්භක ගෝලීය ක්රියාත්මක සන්දර්භය (දී ක්රියාත්මක §10.4.2 (1)).

Call15.1.2.1.1 මගින් සෘජු ඇමතුමක් යනු කුමක්ද යන්න අර්ථ දක්වයි eval(). මූලික වශයෙන්, eval(...)සෘජු ඇමතුමක් වන අතර යම් දෙයක් වක්‍ර ඇමතුමක් වැනි (0, eval)(...)හෝ var indirectEval = eval; indirectEval(...);වේ eval(). බලන්න chuckj පිළිතුර කිරීමට JavaScript දී eval ( 'මේ') එදිරිව (1 eval,) (මෙම ')? සහ දිමිත්‍රි සොෂ්නිකොව්ගේ ECMA-262-5 විස්තරාත්මකව. පරිච්ඡේදය 2. දැඩි ප්‍රකාරය. ඔබ වක්‍ර eval()ඇමතුමක් භාවිතා කරන විට .

3. ශ්‍රිත කේතය ඇතුළත් කිරීම

ශ්‍රිතයක් ඇමතීමේදී මෙය සිදු වේ. 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විට, ශ්‍රිතය හැඳින්වූ විට එහි වටිනාකම කුමක් දැයි සහතික කිරීම සඳහා ඔබ ප්‍රලේඛනය වෙත යොමු විය යුතුය .

ජාවාස්ක්‍රිප්ට් පුස්තකාලයක වටිනාකම හසුරුවන්නේ කෙසේදැයි ඔබ කල්පනා කරන්නේ නම් 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);

ඊතල කාර්යයන්

ඊතල ශ්‍රිත (ECMA6 හි හඳුන්වා දී ඇත) විෂය පථය වෙනස් කරයි this. පවත්නා කැනොනිකල් ප්‍රශ්නය බලන්න, ඊතල ශ්‍රිතය එදිරිව ශ්‍රිත ප්‍රකාශනය / ප්‍රකාශන: ඒවා සමාන / හුවමාරු කළ හැකිද? වැඩි විස්තර සඳහා. නමුත් කෙටියෙන්:

ඊතල ක්‍රියාකාරිත්වයට තමන්ගේම this.... බන්ධන නොමැත. ඒ වෙනුවට, එම හඳුනාගැනීම් වෙනත් ඕනෑම විචල්‍යයක් මෙන් ශබ්දකෝෂ විෂය පථය තුළ විසඳනු ලැබේ. ඒ කියන්නේ ඊතල ශ්‍රිතයක් තුළ, this... thisඊතල ශ්‍රිතය අර්ථ දක්වා ඇති පරිසරයේ අගයන් වෙත යොමු කරන්න .

විනෝදය සඳහා, උදාහරණ කිහිපයක් සමඟ ඔබේ අවබෝධය පරීක්ෂා කරන්න

පිළිතුරු හෙළි කිරීමට, ලා අළු පෙට්ටි මත මූසිකය.

  1. thisසලකුණු කරන ලද රේඛාවේ වටිනාකම කුමක්ද? මන්ද?

window - ආරම්භක ගෝලීය ක්‍රියාත්මක කිරීමේ සන්දර්භය තුළ සලකුණු කරන ලද රේඛාව ඇගයීමට ලක් කෙරේ.

    if (true) {
        // What is `this` here?
    }
  1. ක්‍රියාත්මක කරන 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);
  

  1. 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);
  

  1. thisසලකුණු කරන ලද රේඛාවේ වටිනාකම කුමක්ද? මන්ද?

window

මෙය උපක්‍රමශීලී විය. Eval කේතය තක්සේරු කිරීමේදී, thisවේ obj. කෙසේ වෙතත්, eval කේතයේ, myFunවස්තුවක් මත කැඳවනු නොලැබේ, එබැවින් මෙම බන්ධනය windowඇමතුම සඳහා සකසා ඇත .

 <!-- no snippet because, seemingly, eval doesnt work in snippets -->

    function myFun() {
        return this; // What is `this` here?
    }
    var obj = {
        myMethod: function () {
            eval("myFun()");
        }
    };
  1. 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
Li අලි: ඒවා ECMAScript ප්‍රමිතිය, ECMA-262 හි 5.1 සංස්කරණය තුළ ඇති කොටස් සඳහා යොමු කිරීම් වේ . ඔබට අවශ්‍ය නම් තාක්ෂණික විස්තර සඳහා ප්‍රමිතිය කියවීමට හැකි වන පරිදි මම ඒවා සපයමි.
ඩැනියෙල් ට්‍රෙබියන්

1
මම හිතන්නේ up සුපර්ටොන්ස්කි # 2 ගැන නිවැරදියි - myFun () ගෝලීය විෂය පථයෙන් කැඳවනු ලැබුවද, වස්තුව පිළිබඳ ක්‍රමයක් ලෙස නොව, “මෙය” ගෝලීය වස්තුව වනු ඇත, එබැවින් ප්‍රශ්නයේ වාක්‍ය ඛණ්ඩනය වැදගත් වේ. btw - මේ වගේ දෙයකට පිළිතුර ලබා ගැනීම සඳහා මූසිකය භාවිතා කිරීමේ අදහසට මම ඇත්තෙන්ම කැමතියි.
user655489

2
එහෙත්, jsfiddle.net/H4LYm/2 බව සංදර්ශන setTimeoutඋදාහරණයක් ඇත thiswindow(global).
කෙවින් මෙරඩිත්

2
3 වන උදාහරණයට මා පිවිසෙන විට මා තුළ ඇති වූ කලකිරීමේ මට්ටම පයිතන් වලින් කෙනෙකුට සිතාගත හැකිය .. smh
Marius Mucenicu

1
වෙනස්කම් හුදෙක් පාරිභාෂිත වුවත්, ES2020 යථාර්ථය පිළිබිඹු වන පරිදි මෙම පිළිතුර යාවත්කාලීන කළ යුතුය.
බෙන් ඇස්ටන්

161

මෙම thisවෙනස් JavaScript දී මූල පදය හැසිරෙනු වෙනත් භාෂා සාපේක්ෂව. Object Oriented භාෂාවලින්, 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]

2. වස්තු ක්‍රමය තුළ භාවිතා කරන විට

ඔබ 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

3. සන්දර්භය-අඩු ශ්‍රිතයක් ක්‍රියාත්මක කිරීමේදී

ඔබ 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ක්‍රියාකරු භාවිතා කළ යුතුය.
  • වස්තු වචනානුසාරී ප්‍රවේශයකදී, අපට තිත් ක්‍රියාකරු භාවිතා කර දැනටමත් අර්ථ දක්වා ඇති වස්තුවකට සාමාජිකයින් පැහැදිලිව එකතු කළ හැකිය. මෙය විශේෂිත අවස්ථාවට පමණක් එකතු වේ. කෙසේ වෙතත් මම ශ්‍රිත මූලාකෘතියට විචල්‍යය එක් කර ඇති අතර එමඟින් එය ශ්‍රිතයේ සෑම අවස්ථාවකම පිළිබිඹු වේ.

පහත මම වස්තුව හා 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

4. ඉදිකිරීම්කරුගේ ක්‍රියාකාරිත්වය තුළ භාවිතා කරන විට .

ශ්‍රිතය ඉදිකිරීම්කරුවෙකු ලෙස භාවිතා කරන විට (එය 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   

6. ඇතුළත ඇමතුම (), අයදුම් කරන්න () සහ බන්ධන () කාර්යයන්

  • මෙම සියලු ක්‍රම නිර්වචනය කර Function.prototypeඇත.
  • මෙම ක්‍රම මඟින් ශ්‍රිතයක් එක් වරක් ලිවීමට සහ විවිධ සන්දර්භය තුළ එය ක්‍රියාත්මක කිරීමට ඉඩ ලබා දේ. වෙනත් වචන වලින් කිවහොත්, thisශ්‍රිතය ක්‍රියාත්මක වන විට භාවිතා කරනු ලබන වටිනාකම නියම කිරීමට ඒවා ඉඩ දෙයි . මුල් ශ්‍රිතයට ආයාචනා කරන විට ඒවා ලබා දීමට ඕනෑම පරාමිතියක් ද ගනී.
  • fun.apply(obj1 [, argsArray])කට්ටල obj1වටිනාකම ලෙස thisඇතුළත fun()හා ඇමතුම් fun()අංග පසුකර argsArrayසිය තර්ක ලෙස.
  • fun.call(obj1 [, arg1 [, arg2 [,arg3 [, ...]]]])- ඇතුළත obj1වටිනාකම ලෙස thisසැකසෙන fun()අතර ඇමතුම් fun()සම්මත arg1, arg2, arg3, ...කිරීම එහි තර්ක ලෙස දැක්වේ.
  • fun.bind(obj1 [, arg1 [, arg2 [,arg3 [, ...]]]])- ඇතුළත විනෝදය හා නිශ්චිත පරාමිතීන් සමඟ බැඳී ඇති පරාමිතීන් funසමඟ ශ්‍රිතය වෙත යොමු කිරීම .thisobj1funarg1, arg2, arg3,...
  • මේ වන විට apply, callසහ අතර වෙනස bindපැහැදිලිව පෙනෙන්නට තිබේ. applyඅරාව-සමාන වස්තුවක් ලෙස ක්‍රියා කිරීමට තර්ක නියම කිරීමට ඉඩ දෙයි, එනම් සංඛ්‍යාත්මක lengthදේපලක් සහ ඊට අනුරූප negative ණ නොවන පූර්ණ සංඛ්‍යා ගුණාංග සහිත වස්තුවකි . ඇති ෙහයින්ද 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සිදුවීම් හසුරුවන්නන් තුළ

  • ඔබ මූලද්‍රව්‍යයක සිදුවීම් හසුරුවන්නන්ට සෘජුවම ශ්‍රිතය පැවරූ විට, thisසෘජුවම ඇතුළත සිදුවීම් හැසිරවීමේ ශ්‍රිතය භාවිතා කිරීම අනුරූප මූලද්‍රව්‍යයට යොමු වේ. එවැනි සෘජු කාර්යයන් පැවරීම addeventListenerක්‍රමවේදය භාවිතයෙන් හෝ සාම්ප්‍රදායික සිදුවීම් ලියාපදිංචි කිරීමේ ක්‍රම හරහා කළ හැකිය onclick.
  • ඒ හා සමානව, ඔබ මූලද්රව්යයේ thisසිදුවීම් දේපල (වැනි <button onclick="...this..." >) තුළ කෙලින්ම භාවිතා කරන විට , එය මූලද්රව්යයට යොමු වේ.
  • කෙසේ වෙතත් this, සිදුවීම් හැසිරවීමේ ශ්‍රිතය හෝ සිදුවීම් දේපල තුළ හැඳින්වෙන අනෙක් ශ්‍රිතය හරහා වක්‍රව භාවිතා කිරීම ගෝලීය වස්තුවට නිරාකරණය windowවේ.
  • මයික්‍රොසොෆ්ට් හි සිදුවීම් ලියාපදිංචි කිරීමේ ආකෘතිය භාවිතා කරමින් අපි සිදුවීම් හසුරුවන්නාට අනුයුක්ත කරන විට ඉහත හැසිරීමම සාක්ෂාත් කරගනු ලැබේ attachEvent. සිදුවීම් හසුරුවන්නාට ශ්‍රිතය පැවරීම වෙනුවට (සහ එමඟින් මූලද්‍රව්‍යයේ ක්‍රියාකාරී ක්‍රමය සෑදීම), එය සිදුවීම මත ශ්‍රිතය හඳුන්වයි (එය ගෝලීය සන්දර්භය තුළ effectively ලදායී ලෙස හැඳින්වේ).

JSFiddle හි මෙය වඩා හොඳින් උත්සාහ කිරීමට මම නිර්දේශ කරමි .

<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 

"ඔබ මෙය ගෝලීය සන්දර්භය තුළ අර්ථ දක්වා ඇති ශ්‍රිතයක් තුළ භාවිතා කරන විට, මෙය තවමත් ගෝලීය වස්තුවට බැඳී ඇත. වැරදියි. මෙය සකසා ඇත්තේ ශ්‍රිතයක් හැඳින්වෙන ආකාරය හෝ බන්ධනය කිරීමෙනි. මූලික සඳහනක් නොමැතිව ("සන්දර්භය") ඕනෑම ශ්‍රිතයක් ඇමතීමෙන් මෙය ගෝලීය වස්තුවට පෙරනිමිය හෝ දැඩි ආකාරයෙන් නිර්වචනය නොකෙරේ.
RobG

ObRobG hmm විය හැකිය, නමුත් මම මෙය MDN හි සොයාගතිමි : මේ අවස්ථාවේ දී, වටිනාකම thisඇමතුම මගින් සකසා නොමැත. කේතය දැඩි මාදිලියේ නොමැති බැවින්, එහි අගය thisසැමවිටම වස්තුවක් විය යුතු බැවින් එය ගෝලීය වස්තුවට පෙරනිමිය. ඇත්ත වශයෙන්ම මා සිතුවේ අපට කෙලින්ම ඇමතුමක් ලබා ගත හැකි යැයි සිතූ window.f1()නිසා, එයින් අදහස් f1()වන්නේ දැනටමත් windowවස්තුවට සම්බන්ධ වී ඇති බවයි . මම එය වැරදියට තේරුම් ගන්නවාද?
Mahesha999

මම අදහස් කරන ලදී (සමහර විට නැති පැහැදිලිව) ඔබගේ පිහිටුවීම සම්බන්ධ මත මෙම නම් එය විසින් ආකාරයක නම් "ශ්රිතය ඇත්තටම ගෝලීය සන්දර්භය ක්රමයක් ඉදිරිපත් කරයි" සමග, window.fnඑය නොවන. මෙය ගෝලීය වස්තුවට පෙරනිමි වන්නේ ඇමතුමෙහි කිසිදු මූලික සඳහනක් භාවිතා නොකිරීම නිසා නොව, ශ්‍රිතය අර්ථ දක්වා ඇති ස්ථානය නිසා නොවේ (එබැවින් මෙය තවමත් සකසා ඇත්තේ ශ්‍රිතය හැඳින්වූ ආකාරය අනුව ය). ඔබ සුවිශේෂව භාවිතා එය අමතන්න නම් window.fn, එවිට ඔබ නගයි මෙම කිරීමට කවුළුව . එකම ප්‍රති result ලය, ඒ ගැන වෙනස් ආකාරයක්. :-)
RobG

"ඉහළින් මම වචනය වහාම දමා ඇත ..." නැත ඔබ එසේ නොකළේය. දෝෂය නිවැරදි වන පරිදි කරුණාකර මෙය සංශෝධනය කළ හැකිද? එය පිළිතුරට අර්ථාන්විත බවක් පෙනේ, එබැවින් වැරදි දෙයක් ඉගෙන ගැනීමට ඇති බිය නිසා දෝෂය නිවැරදි වන තෙක් මට දිගටම කියවිය නොහැක.
ටයිලර් එච්

@TylerH (ද්විත්ව ආකාරයටම) "ක්ෂනික" string සොයා ගැනීමට ඔබගේ බ්රවුසරයේ මෙම පිටුවේ Ctrl + F කරන්න am u වැරදි තේරුම් නම් මම එහි සිතන්නේ,
Mahesha999

65

ජාවාස්ක්‍රිප්ට් 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 ද ඇතුළුව ). උදාහරණයක් ලෙස පහත කේතය ගන්න.thisObjectObjectArrayFunction

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.

හරිම සරලයි නේද?

නිල ECMAScript පිරිවිතරයේ එවැනි ආකාරයේ ශ්‍රිත සත්‍ය constructorශ්‍රිත බව කොතැනකවත් සඳහන් නොවන බව සලකන්න . ඒවා සාමාන්‍ය කාර්යයන් පමණක් newවන අතර ඕනෑම ශ්‍රිතයක් සඳහා භාවිතා කළ හැකිය. එය අප ඒවා ලෙස භාවිතා කිරීම පමණක් වන අතර, එබැවින් අපි ඒවා හඳුන්වන්නේ එවැනි අය ලෙස පමණි.

කාර්යයන් මත ඇමතුම් කාර්යයන්: callසහapply

ඔව්, functions ද 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ඕනෑම ශ්‍රිතයක වටිනාකම වෙනස් කිරීමට ඉතා හොඳ ක්‍රමයක් .

applycallඑය පරාමිති දෙකක් පමණක් බව පිළිගැනීමට බොහෝ දුරට සමාන වේ: thisArgසහ ශ්‍රිතයට යැවිය යුතු තර්ක අඩංගු අරාව. එබැවින් ඉහත callඇමතුම මේ ආකාරයට පරිවර්තනය කළ හැකිය apply:

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

බව සටහන callහා applyවටිනාකම පරයා thisඅප දෙවන වෙඩි සාකච්ඡා තිතක් ක්රමය යාදින්න මඟින් කට්ටලයක්. සරලයි :)

ඉදිරිපත් කිරීම .... bind!

bindcallසහ සහෝදරයෙක් 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. අපි ශ්‍රිතය Object-dot අංකනය සහිත ක්‍රමයක් ලෙස හැඳින්වුවහොත් කුමක් කළ යුතුද?
  3. අපි newමූලික පදය භාවිතා කරන්නේ නම් කුමක් කළ යුතුද ?
  4. අපි කොහොමද හැසිරවීමට නැහැ thisසමග callහා apply?
  5. භාවිතා කිරීම bind.
  6. thisකැදැලි-විෂය පථයේ ගැටළු විසඳීම සඳහා පිටපත් කිරීම .

48

"මේ" සියල්ල විෂය පථයට අදාළ වේ. සෑම ශ්‍රිතයකටම එහි විෂය පථයක් ඇති අතර, JS හි ඇති සෑම දෙයක්ම වස්තුවක් බැවින්, ශ්‍රිතයකට පවා “මෙය” භාවිතා කරමින් යම් අගයන් තමන් තුළම ගබඩා කර ගත හැකිය. OOP 101 උගන්වන්නේ "මෙය" අදාළ වන්නේ වස්තුවක අවස්ථාවන්ට පමණක් බවයි. එබැවින්, ශ්‍රිතයක් ක්‍රියාත්මක වන සෑම අවස්ථාවකම, එම ශ්‍රිතයේ නව “නිදසුනක්” සඳහා “මෙය” යන්නෙහි නව අරුතක් ඇත.

නිර්නාමික වසා දැමීමේ කාර්යයන් තුළ "මෙය" භාවිතා කිරීමට උත්සාහ කරන විට බොහෝ අය ව්‍යාකූල වේ:

(ශ්‍රිතය (අගය) {
    this.value = අගය;
    $ ('. සමහර මූලද්‍රව්‍ය'). එක් එක් (ශ්‍රිතය (එල්ට්) {
        elt.innerHTML = this.value; // අහ් !! සමහර විට නිර්වචනය කර නැත
    });
}) (2);

එබැවින් මෙහි, එක් එක් () ඇතුළත, "මෙය" ඔබ අපේක්ෂා කරන "වටිනාකම" රඳවා නොගනී

this.value = අගය;
ඊට ඉහළින්). එබැවින්, මෙම ගැටළුව මඟහරවා ගැනීම සඳහා, සංවර්ධකයෙකුට කළ හැක්කේ:

(ශ්‍රිතය (අගය) {
    var self = මෙය; // කුඩා වෙනසක්
    self.value = අගය;
    $ ('. සමහර මූලද්‍රව්‍ය'). එක් එක් (ශ්‍රිතය (එල්ට්) {
        elt.innerHTML = self.value; // පියු !! == 2
    });
}) (2);

එය අත්හදා බලන්න; ඔබ මෙම ක්‍රමලේඛ රටාවට කැමති වීමට පටන් ගනී


6
"JS හි ඇති සියල්ල වස්තුවක්" සත්‍ය නොවේ, ජාවාස්ක්‍රිප්ට් ද ප්‍රාථමික අගයන් ඇත, bclary.com/2004/11/07/#a-4.3.2
මාර්සල් කෝර්පල්

6
ප්‍රාථමික අගයන් තමන් මත යම් යම් ක්‍රම ඇති බව පෙනේ, එනම් String # උපස්ථරය (), අංක # toString () යනාදියයි. එබැවින්, සමහර විට එම ලිපියේ එකම නාමකරණය සමඟ නොව, ඒවා ඇත්ත වශයෙන්ම හැසිරෙන්නේ ඒවා වස්තූන් ලෙස ය (ඒවා සියලු මූලාකෘති, එනම්, නූල් # උපස්ථරය () සැබවින්ම: String.prototype.substring = ශ්‍රිතය () {...}). මම වැරදියි නම් කරුණාකර මාව නිවැරදි කරන්න.
arunjitsingh

12
මෙම thisමූල පදය විෂය පථය සම්බන්ධයෙන් කිසිවක් ම නැත. එසේම, වස්තූන්ගේ ගුණාංග නොවන ශ්‍රිතවල ද එයට අර්ථයක් ඇත.
බර්ගි

1
un අරුන්ජිට්සිං h ඒ පිළිබඳ චින්තන පාසල් දෙකක් තිබේ. " සෑම දෙයක්ම වස්තුවක්, නමුත් සමහර ඒවා පහසුව සඳහා ප්‍රාථමිකයන් විසින් නිරූපණය කළ හැකිය " යනුවෙන් පවසන එකට මම කැමතියි . ;-)
RobG

9
thisවිෂය පථය පිළිබඳ සියල්ලම නොවේ. එය ක්‍රියාත්මක කිරීමේ සන්දර්භය පිළිබඳ සියල්ලම වේ, එය විෂය පථයට සමාන නොවේ. ජාවාස්ක්‍රිප්ට් ශබ්දකෝෂයෙන් විෂය පථය (අර්ථය විෂය පථය තීරණය වන්නේ කේතයේ පිහිටීම අනුවය), නමුත් thisඑය තීරණය වන්නේ එය අඩංගු ශ්‍රිතය ආයාචනා කරන්නේ කෙසේද යන්න මතය - එම ශ්‍රිතය කොතැනද යන්න නොවේ.
ස්කොට් මාකස්

17

මෙම ත්‍රෙඩ් එක ඉහළට ඔසවා ඇති හෙයින්, thisමාතෘකාවට අලුතින් පා readers කයන් සඳහා කරුණු කිහිපයක් සම්පාදනය කර ඇත්තෙමි .

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ඉතා callback ශ්රිතයක් ලෙස සම්මත වන අතර, 4) thisඑය වසා දැමීමට ඇතුළත භාවිතා - අභ්‍යන්තර ශ්‍රිතයක්. (2)

වගුව

අනාගතය කෙබඳුද?

ඊසීඑම්ඒ ස්ක්‍රිප්ට් 6 හි අර්ථ දක්වා ඇති පරිදි , ඊතල-ශ්‍රිතයන් 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මූලද්‍රව්‍ය වස්තුව වෙත යොමු වේ. නමුත් ප්‍රවේශම් වන්න, බොහෝ දෙනෙක් මෙම වැරැද්ද කරති.

<element onclick="someKindOfFunction()">

අවසාන අවස්ථාවේ දී, ඔබ හුදෙක් ශ්‍රිතය සඳහන් කරයි, එය මූලද්‍රව්‍යයට භාර නොදෙන්න. එබැවින් thisකවුළු වස්තුව වෙත යොමු වේ.


15

ජාවාස්ක්‍රිප්ට් හි සෑම ක්‍රියාත්මක කිරීමේ සන්දර්භයකම මෙම පරාමිතිය සකසා ඇත්තේ:

  1. ශ්‍රිතය කැඳවන ආකාරය (වස්තු ක්‍රමයක් ලෙස, ඇමතුම් සහ අයදුම් කිරීම, නව භාවිතය ඇතුළුව )
  2. බන්ධනය භාවිතා කිරීම
  3. ඊතල කාර්යයන් සඳහා වචනාර්ථයෙන් (ඔවුන් මෙය ඔවුන්ගේ බාහිර ක්‍රියාත්මක කිරීමේ සන්දර්භය අනුගමනය කරයි )
  4. කේතය දැඩි හෝ දැඩි නොවන ආකාරයෙන් තිබේද යන්න
  5. කේතය භාවිතයෙන් ආයාචනා කර තිබේද යන්න eval

ඔබ අගය සැකසිය හැක මෙම භාවිතා func.call, func.applyහෝ func.bind.

පෙරනිමියෙන් සහ බොහෝ ආරම්භකයින් ව්‍යාකූල කරන්නේ කුමක් ද, DOM මූලද්‍රව්‍යයක් මත සිදුවීමක් මතු වූ පසු සවන්දෙන්නෙකු කැඳවනු ලැබූ විට, ශ්‍රිතයේ මෙම අගය DOM මූලද්‍රව්‍යය වේ.

jQuery මෙම සුළු කාරණය jQuery.proxy සමඟ වෙනස් කිරීමට හේතු වේ.


9
සෑම ක්‍රියාකාරී ඇමතුමකටම විෂය පථයක් ඇති බව පැවසීම තව ටිකක් නිවැරදි ය . වෙනත් වචන වලින් කිවහොත්, දේ ගැන අවුල් වෙනවා thisකරුණාකර Javascript එය වීමයි නොවන ක්රියාව ම, ඒ වෙනුවට, මෙම උත්සවය පළ කළහ වන ආකාරය පිළිබඳ කෞතුක වස්තුවක් මූලික නීතියට දේපල.
පොයින්ටි

@ පොයින්ටි ස්තූතියි. Js හි මේ පිළිබඳව වඩාත්ම ව්‍යාකූල වීමට හේතුව වන්නේ කලින් භාවිතා කළ සියලුම භාෂාවල (c #, c ++), - මෙය හැසිරවිය නොහැක n සෑම විටම වස්තු නිදසුන වෙත යොමු කරන අතර js හි එය රඳා පවතින අතර එය ක්‍රියාත්මක කිරීමේදී වෙනස් කළ හැකිය. භාවිතා කාර්යයන් func.call, func.bindආදිය - සුෂිල්
සුෂිල්

2
thisනැහැ නැහැ උත්සවයකට ගේ විෂය පථය ධව. thisනිෂ්චිත වස්තුවක් (හෝ සමහර විට අදාල වනු ඇත undefinedඔබ කියා ඇති ලෙස භාවිතා කර වෙනස් කල හැකි), .call()හෝ .apply(). ශ්‍රිතයක විෂය පථය (අත්‍යවශ්‍යයෙන්ම, සරල කළ විට) එයට ප්‍රවේශ විය හැකි විචල්‍යයන් වන අතර මෙය සම්පූර්ණයෙන්ම රඳා පවතින්නේ ශ්‍රිතය ප්‍රකාශයට පත් කරන ස්ථානය මත වන අතර එය වෙනස් කළ නොහැක.
nnnnnn

පොයින්ටි: "සෑම ක්‍රියාකාරී ඇමතුමකටම විෂය පථයක් ඇති බව පැවසීම තව ටිකක් නිවැරදි ය." ශ්‍රිතයන්ට (සහ දැන් වාරණ) විෂය පථයක් ඇති බව පැවසීම ඊටත් වඩා නිවැරදිය , ශ්‍රිත ඇමතුම් සඳහා සන්දර්භය ඇත. එම විෂය පථය තුළ කේතය මඟින් භාවිතා කළ හැකි හඳුනාගැනීම් මොනවාද යන්න විෂය පථය මගින් අර්ථ දක්වා ඇත. සන්දර්භය මඟින් එම හඳුනාගැනීම් වලට බැඳී ඇති දේ අර්ථ දක්වයි.
ටී. ජේ. ක්‍රෝඩර්

1
"එම විෂය පථය කුමක් වුවත්, මෙය" මෙය "මගින් යොමු කෙරේ. නැත, thisසහ විෂය පථයට ES5 සහ ඊට පෙර එකිනෙකා සමඟ කිසිම සම්බන්ධයක් නැත (උදා: මෙම පිළිතුර ලියන විට). ES2015 (ES6 හෙවත්) තුල, thisසහ විෂය පථය සම්බන්ධ ය එක තරමක් අවම මාර්ගය කාර්යයන් arrow wrt (මෙම 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"

    දී nodeඇති repl භාවිතා 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
  • මෙය ක්‍රියාත්මක කරන්න

DOM සිදුවීම් හසුරුවන්නන් හැරුණු විට හෝ ලබා දී ඇති විට 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"
  • DOM මෙය සිදු කරයි

HTML DOM සිදුවීම් හසුරුවන්නෙකු තුළ, thisසැමවිටම සිදුවීම අමුණා ඇති DOM අංගයට යොමු කිරීමකි

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();
  • මෙය HTML කරන්න

ඔබට ජාවාස්ක්‍රිප්ට් දැමිය හැකි HTML ගුණාංග ඇතුළත 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එක් thisකිරීමට ඔබට භාවිතා කළ හැකිය .thisthis

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 බොහෝ ස්ථානවල thisDOM මූලද්‍රව්‍යයක් වෙත යොමු වේ.

<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"> පෙර සහ ඊට පෙර අමුණා ඇති වෙනත් ඕනෑම හසුරුවන්නන් අභිබවා යන පේළිගත සිදුවීම් හසුරුවන්නන්, එබැවින් ප්‍රවේශම් වන්න, ඉන්ලයින් සිදුවීම් නියෝජිතයින්ගෙන් stay ත්ව සිටීම වඩා හොඳය. විසංවාදී විවාදයක් තුළින් මෙම උදාහරණ ලැයිස්තුවට මා පෙලඹවූ සාරා ඇලවර්ඩියන්ට ස්තූතියි :)

  • 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

ජාවාස්ක්‍රිප්ට් හි "මෙම" මූල පදය අර්ථ නිරූපණය කරන්නේ කෙසේද යන්න පිළිබඳව විශාල ව්‍යාකූලතාවයක් පවතී . මෙම ලිපියෙන් සියල්ලන්ම එකවර විවේක ගැනීමට බලාපොරොත්තු වේ. සහ තවත් බොහෝ දේ. කරුණාකර සම්පූර්ණ ලිපිය ප්‍රවේශමෙන් කියවන්න. මෙම ලිපිය දිගු බව කල්තියාම අනතුරු අඟවන්න.

එය භාවිතා කරන සන්දර්භය කුමක් වුවත්, "මෙය" සැමවිටම ජාවාස්ක්‍රිප්ට් හි "වත්මන් වස්තුව" ගැන සඳහන් කරයි. කෙසේ වෙතත්, "වත්මන් වස්තුව" යනු සන්දර්භය අනුව වෙනස් වේ . මෙම සන්දර්භය හරියටම විය හැකිය 1 6 පහත:

  1. ගෝලීය (එනම් සියලුම ක්‍රියාකාරකම් වලින් පිටත)
  2. සෘජු “මායිම් නොවන ශ්‍රිතය” ඇමතුම ඇතුළත (එනම් functionName.bind ඇමතීමෙන් බැඳී නැති ශ්‍රිතයක් )
  3. ඇතුළත වක්‍ර “මායිම් නොවන ක්‍රියාකාරිත්වය” functionName.call සහ functionName.apply හරහා අමතන්න
  4. "මායිම් ශ්‍රිතය" ඇමතුම ඇතුළත (එනම් functionName.bind ඇමතීමෙන් බැඳී ඇති ශ්‍රිතයක් )
  5. "නව" හරහා වස්තු නිර්මාණය අතරතුර
  6. Inline DOM සිදුවීම් හසුරුවන්නා තුළ

පහත දැක්වෙන්නේ මෙම එක් එක් සන්දර්භය එකින් එක විස්තර කිරීමයි:

  1. ගෝලීය සන්දර්භය (එනම් සියලු කාර්යයන්ට පිටතින්):

    සියලුම ශ්‍රිතයන්ට පිටතින් (එනම් ගෝලීය සන්දර්භය තුළ) “වත්මන් වස්තුව” (එබැවින් “මේ” හි වටිනාකම ) සෑම විටම බ්‍රව්සර් සඳහා “කවුළු” වස්තුව වේ.

  2. ඇතුළත සෘජු “මායිම් නොවන ක්‍රියාකාරිත්වය” අමතන්න :

    "ජු මායිම් නොවන ශ්‍රිත" ඇමතුමක් තුළ, ශ්‍රිත ඇමතුම ඉල්ලා සිටි වස්තුව "වත්මන් වස්තුව" බවට පත්වේ (එබැවින් "මෙය" හි වටිනාකම ). උත්සවයකට වූ පැහැදිලි තොරව ලෙස හැඳින්වේ නම් වත්මන් වස්තුව වන වත්මන් වස්තුව එක්කෝ වේ "කවුළුව" වස්තුව (නොවන දැඩි ප්රකාරය සඳහා) හෝ නිර්වචනය නොකළ (දැඩි ප්රකාරය සඳහා). ගෝලීය සන්දර්භය තුළ අර්ථ දක්වා ඇති ඕනෑම ශ්‍රිතයක් (හෝ විචල්යයක්) ස්වයංක්‍රීයව "කවුළු" වස්තුවක දේපලක් බවට පත්වේ. නිදසුනක් ලෙස ශ්‍රිතය ගෝලීය සන්දර්භය තුළ අර්ථ දක්වා ඇති බව සිතමු

    function UserDefinedFunction(){
        alert(this)
        }

    එය කවුළු වස්තුවේ දේපල බවට පත්වේ, ඔබ එය අර්ථ දක්වා ඇති ආකාරයට

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

    "නොවන දැඩි ප්රකාරය" තුළ, ඇමතුම් / මගින් සෘජුවම මෙම ශ්රිතය වෙනුවෙන් හඬ නැඟුවාය "UserDefinedFunction ()" ස්වයංක්රීයව එය පහ කියනු ඇත / ලෙස "window.UserDefinedFunction ()" කරමින් "කවුළුව" ලෙස "වත්මන් වස්තුව" (සහ ඒ නිසා වටිනාකම " මෙය " ) " UserDefinedFunction "තුළ ඇත .මෙම ශ්‍රිතය" දැඩි නොවන ප්‍රකාරයේදී "ක්‍රියාත්මක කිරීමෙන් පහත සඳහන් දේ සිදුවනු ඇත

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

    ඇමතුම් / හරහා කෙලින්ම උත්සවය වෙනුවෙන් හඬ නැඟුවාය "දැඩි ප්රකාරය", දී "UserDefinedFunction ()" ඇත "නොවේ" ස්වයංක්රීයව එය පහ ලෙස ඇමතුම් / "window.UserDefinedFunction ()" .Hence වන "වත්මන් වස්තුව" (සහ වටිනාකම "මෙම" ) "UserDefinedFunction" තුළ නිර්වචනය කළ නොහැක . "දැඩි ප්‍රකාරය" තුළ මෙම ශ්‍රිතය යෙදීමෙන් පහත සඳහන් දේ සිදුවනු ඇත

    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" සහ "ආ" ප්රදර්ශනය වෙනවා. වටිනාකම "ඇ" සහ "ඈ" ලෙස පෙන්වා ඇත ලදී නිර්වචනය නොකළ ලෙස o1 මෙම ගුණ වත් නැත

    මීට සමාන වූ විට "UserDefinedFunction" හරහා පළ කළහ විය O2 , "මෙම" වටිනාකම ගනී O2 අතර එහි ගුණ වටිනාකම "ඇ" සහ "ඈ" ක displayed.The අගයක් ලබා "A" සහ "ආ" ලෙස පෙන්වා ඇත ලදී නිර්වචනය නොකළ ලෙස O2 කරන්නේ මෙම ගුණාංග නිර්වචනය නොකරයි.

  3. ඇතුළත වක්‍ර "මායිම් නොවන ක්‍රියාකාරිත්වය" functionName.call සහ functionName.apply හරහා අමතන්න :

    කරන විට "නොවන බැඳී කාර්යභාරය" හරහා හැඳින්වේ functionName.call හෝ functionName.apply , එම "වත්මන් වස්තුව" (සහ ඒ නිසා වටිනාකම "මෙම" ) වටිනාකම කිරීමට පියවර ගෙන තිබේ "මෙම" පරාමිතිය (පළමු පරාමිතිය) වෙත සම්මත ඇමතුමක් අයදුම් කරන්න . පහත කේතය එයම පෙන්නුම් කරයි.

    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

    ඉහත කේතය පැහැදිලිවම පෙන්නුම් කරන්නේ ඕනෑම "NON මායිම් ශ්‍රිතයක්" සඳහා වන "මෙම" අගය ඇමතුම / අයදුම් කිරීම මගින් වෙනස් කළ හැකි බවයි . එසේම, "මෙය" නම් පරාමිතිය ඇමතීමට / අයදුම් කිරීමට පැහැදිළිව සම්මත කර නොමැති නම් , "වත්මන් වස්තුව" (එම නිසා "මෙය" හි අගය) දැඩි නොවන මාදිලියේ "කවුළුව" ලෙසත් දැඩි මාදිලියේ "නිර්වචනය නොකළ" ලෙසත් සකසා ඇත .

  4. "මායිම් ශ්‍රිතය" ඇමතුම ඇතුළත (එනම් functionName.bind ඇමතීමෙන් බැඳී ඇති ශ්‍රිතයක් ):

    බැඳී ඇති ශ්‍රිතයක් යනු “මෙම” අගය ස්ථාවර කර ඇති ශ්‍රිතයකි . බැඳී ඇති ශ්‍රිතයකදී “මෙය” ක්‍රියාත්මක වන්නේ කෙසේද යන්න පහත කේතය මගින් පෙන්නුම් කෙරේ

    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. පේළිගත DOM සිදුවීම් හසුරුවන්නා තුළ :

    කරුණාකර පහත HTML ස්නිපටය දෙස බලන්න

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

    ඉහත උදාහරණවල ඇති “මෙය” පිළිවෙලින් “බොත්තම” මූලද්‍රව්‍යය සහ “div” මූලද්‍රව්‍යය.

    පළමු උදාහරණයේ දී, බොත්තම ක්ලික් කළ විට එහි අකුරු වර්ණය සුදු පැහැයට සකසනු ඇත.

    දෙවන උදාහරණයේ දී “div” මූලද්‍රව්‍යය ක්ලික් කළ විට එය OnDivClick ශ්‍රිතය එහි දෙවන පරාමිතිය සමඟ ක්ලික් කළ div මූලද්‍රව්‍යය සඳහන් කරයි. කෙසේ වෙතත් OnDivClick තුළ ඇති "මෙය" හි අගය ක්ලික් කළ div මූලද්‍රව්‍යය සඳහන් නොකරයි . එය ලෙස කළ යුතු ය කළ "කවුළු වස්තුව" හෝ "නිර්වචනය නොකළ" දී නොවන දැඩි හා දැඩි ක්රම පිළිවෙළින් (නම් OnDivClick යනු සංඛ්යාවට සමාන සංඛ්යාවකි කාර්යය ) හෝ සපයනවා බැඳී අගය (සකසා නම් OnDivClick යනු බැඳී උත්සවය )

පහත දැක්වෙන්නේ සමස්ත ලිපියම සාරාංශ කිරීමයි

  1. ගෝලීය සන්දර්භය තුළ "මෙය" සැමවිටම "කවුළු" වස්තුවට යොමු වේ

  2. කිසියම් ශ්‍රිතයක් ආයාචනා කරන සෑම අවස්ථාවකම එය වස්තුවක සන්දර්භය තුළ ආයාචනා කරනු ලැබේ ( "වත්මන් වස්තුව" ). නම් වත්මන් වස්තුව සුවිශේෂව ලබාදී නොමැති නම්, දැනට පවතින වස්තුවක් යනු "කවුළු වස්තුව" ගැන නොවන දැඩි ප්රකාරය හා "නිර්වචනය නොකළ" පෙරනිමියෙන් දැඩි ප්රකාරය.

  3. මායිම් රහිත ශ්‍රිතයක් තුළ ඇති “මෙය” හි අගය යනු ශ්‍රිතය ආයාචනා කරන සන්දර්භය තුළ වස්තුව වෙත යොමු කිරීමයි ( “වත්මන් වස්තුව” )

  4. වටිනාකම "මෙම" ඇති නොවන බැඳී ශ්රිතය අනුසාරයෙන්, විසින් overriden කළ හැකි ඇමතුමක් හා අදාළ උත්සවයට ක්රම.

  5. වටිනාකම "මෙම" බැඳුණු උත්සවය සඳහා ස්ථාවර විසින් overriden කළ නොහැකි ඇමතුමක් හා අදාළ උත්සවයට ක්රම.

  6. බන්ධනය සහ දැනටමත් බැඳී ඇති ශ්‍රිතය "මෙය" හි අගය වෙනස් නොකරයි. එය පළමු බන්ධන ශ්‍රිතය මඟින් සකසා ඇති අගය ලෙස සකසා ඇත.

  7. "මෙය" හි වටිනාකමඉදිකිරීම්කරුවෙකු තුළ ඇති වන්නේ නිර්මාණය කරන ලද සහ ආරම්භ කරන වස්තුවයි

  8. පේළිගත DOM සිදුවීම් හසුරුවන්නෙකු තුළ ඇති “මෙය” හි වටිනාකම යනු සිදුවීම් හසුරුවන්නා ලබා දී ඇති මූලද්‍රව්‍යයයි.


9

බොහෝ විට වඩාත් සවිස්තරාත්මක හා සවිස්තරාත්මක ලිපිය thisපහත දැක්වේ:

ජාවාස්ක්‍රිප්ට් හි 'මෙම' මූල පදය පිළිබඳ මෘදු පැහැදිලි කිරීම

පිටුපස ඇති අදහස thisනම්, ශ්‍රිත ආයාචනා වර්ගවල thisඅගය සැකසීමේදී සැලකිය යුතු වැදගත්කමක් ඇති බව වටහා ගැනීමයි .


හඳුනාගැනීමේදී කරදර ඇති විට this, ඔබෙන්ම මෙසේ අසන්න එපා :

කොහෙද මේ thisගෙන ?

නමුත් කරන්නේ ඔබ අහන්න:

කොහොමද කාර්යභාරය වන්නේ පළ කළහ ?

ඊතල ශ්‍රිතයක් සඳහා (සන්දර්භය විනිවිදභාවයේ විශේෂ අවස්ථාව) ඔබෙන්ම මෙසේ අසන්න:

දේ අගය කර thisඇති ඊතලය කාර්යය කරනු ලබන අර්ථ ?

ගනුදෙනු කිරීමේදී මෙම මානසිකත්වය නිවැරදි වන thisඅතර හිසරදයෙන් ඔබව ගලවා ගනු ඇත.


ඔබේ බ්ලොග් අඩවියට සම්බන්ධ වීමට අමතරව, එම ප්‍රශ්න ඇසීම යමෙකුට thisමූලික පදය තේරුම් ගැනීමට උපකාරී වන්නේ කෙසේද යන්න පිළිබඳව ගැඹුරින් සොයා බැලිය හැකිය.
මැග්නස් ලින්ඩ් ඔක්ස්ලන්ඩ්

7

මා දුටු හොඳම පැහැදිලි කිරීම මෙයයි: ජාවාස්ක්‍රිප්ට්ස් මෙය පැහැදිලිව තේරුම් ගන්න

මෙම මෙම යොමු සෑම විටම අදහස් (සහ වටිනාකම පවත්වයි) වස්තුවක්-අසහාය වස්තුව-සහ එය ගෝලීය විෂය පථය තුල උත්සවයකට පිටත භාවිතා කළ හැකි නමුත් එය සාමාන්යයෙන්, විශාල උත්සවයක් හෝ ක්රමය තුළ භාවිතා වේ. අප දැඩි මාදිලියක් භාවිතා කරන විට, මෙය ගෝලීය ශ්‍රිතවල සහ කිසිදු වස්තුවකට බැඳී නැති නිර්නාමික ශ්‍රිතවල නිර්වචනය නොකළ අගය දරයි.

මෙය ව්‍යාකූල විය හැකි අවස්ථා හතරක් ඇත:

  1. අපි (භාවිතා කරන ක්රමය සමත් වූ විට මෙම වන callback ශ්රිතයක් ලෙස භාවිතා කිරීමට තර්කයක් ලෙස).
  2. අපි අභ්‍යන්තර ශ්‍රිතයක් භාවිතා කරන විට (වසා දැමීම). මෙම විචල්‍යයට ප්‍රවේශ විය හැක්කේ මෙම විචල්‍ය පදය භාවිතා කිරීමෙන් මෙම විචල්‍යයට බාහිර ශ්‍රිතයට ප්‍රවේශ විය නොහැකි බව සැලකිල්ලට ගැනීම වැදගත්ය. මන්ද මෙම විචල්‍යයට ප්‍රවේශ විය හැක්කේ අභ්‍යන්තර ශ්‍රිතවලින් නොව ශ්‍රිතයෙන් පමණි.
  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

ඉහත අපි '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

Line1 ක්රියාත්මක කර ඇති විට, ජාවා ස්ථාපිත කරමින්, කාර්යය ඇමතුමක් සඳහා ක්රියාත්මක සන්දර්භය (EC) තහවුරු thisකිරීමට පසුගිය පෙර පැමිණි ඕනෑම නමෙන්ම වස්තුව "." . එබැවින් අවසාන පේළියේ a()දී එය ගෝලීය සන්දර්භය තුළ ක්‍රියාත්මක වූ බව ඔබට තේරුම් ගත හැකිය window.

ඉදිකිරීම්කරු සමඟ

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එය (සොයා ගත හැකි වඩාත් ගෝලීය සන්දර්භය referes 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

"මෙය" හි අගය රඳා පවතින්නේ ශ්‍රිතය ක්‍රියාත්මක වන "සන්දර්භය" මත ය. සන්දර්භය ඕනෑම වස්තුවක් හෝ ගෝලීය වස්තුවක් විය හැකිය, එනම් කවුළුව.

එබැවින් "මෙය" හි අර්ථ නිරූපණය සාම්ප්‍රදායික OOP භාෂාවන්ට වඩා වෙනස් ය. තවද එය ගැටළු ඇති කරයි: 1. ශ්‍රිතයක් වෙනත් විචල්‍යයකට යොමු කළ විට (බොහෝ දුරට ඇමතුම් ලබා ගැනීම); සහ 2. පංතියක සාමාජික ක්‍රමයකින් වසා දැමීමක් සිදු කළ විට.

අවස්ථා දෙකේදීම, මෙය කවුළුවට සකසා ඇත.


3

Whould මෙම උදව්? (ජාවාස්ක්‍රිප්ට් හි 'මෙය' පිළිබඳ බොහෝ ව්‍යාකූලතාවයන් පැමිණෙන්නේ එය සාමාන්‍යයෙන් ඔබේ වස්තුව සමඟ සම්බන්ධ නොවීම නිසා නොව වර්තමාන ක්‍රියාත්මක වන විෂය පථයට ය - එය හරියටම ක්‍රියා කරන ආකාරය නොවිය හැකි නමුත් සෑම විටම මට එය දැනේ - සම්පූර්ණ පැහැදිලි කිරීමක් සඳහා ලිපිය බලන්න)


1
එය " වත්මන් ක්‍රියාත්මක කිරීමේ සන්දර්භය සමඟ" සම්බන්ධ වී ඇති බව පැවසීම වඩා හොඳය . ඊඑස් 6 (කෙටුම්පත) හැර ඊතල ශ්‍රිත සමඟ වෙනස් වන අතර පිටත ක්‍රියාත්මක කිරීමේ සන්දර්භය මත මෙය නිරාකරණය වේ.
රොබ්

3

මේ ගැන ටිකක් තොරතුරු මූල පදය

thisතවත් කේතයකින් තොරව ගෝලීය විෂය පථයේ ඇති කොන්සෝලය වෙත යතුරු පදය ලොග් කරමු

console.log(this)

දී සේවාලාභියා / බ්රව්සරය this මූල පදය වන ගෝලීය වස්තුවක්window

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

සහ

දී සේවාදායකය / node එකක් මතම ඊට අදාල / Javascript ධාවන 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 හි අගය සමාන වේ this (මෙය) = $ ('# 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();

effectively ලදායී ලෙස පරිවර්තනය කරන ලදි

foo.call(window);

ඔබ දැඩි මාදිලියක් භාවිතා කරන්නේ නම් එසේ thisවනු ඇති බව සලකන්නundefined

'use strict';

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

foo();  // this is the window object

ඒ කියන්නේ

වෙනත් විදිහකින්,

foo();

effectively ලදායී ලෙස පරිවර්තනය කරන ලදි

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වස්තුව දක්නට ලැබේ නම් JavaScript සොයා ගැනීමට වස්තුව ගේ මූලාකෘති දී බලාපොරොත්තු වනු ඇත b.

වස්තුවක මූලාකෘතිය නිර්වචනය කිරීමට විවිධ ක්‍රම තිබේ, 2019 දී වඩාත් සුලභ වන්නේ classමූල පදයයි. thisඑය වැදගත් නැතත් අරමුණු සඳහා . වැදගත්ම දෙය නම්, එය aදේපල සඳහා වස්තුවක් දෙස බලන bවිට, එය bවස්තුවක් හෝ එහි මූලාකෘති දාමයක් bතුළ ශ්‍රිතයක් ලෙස අවසන් වන්නේ නම්, ඉහත සඳහන් නීති රීති අදාළ වේ. මෙම පිළිතුරේ ඉහළ කෙළවරේ පෙන්වා ඇති පරිදි ශ්‍රිත bයොමු කිරීම් callක්‍රමය භාවිතා aකර වස්තුව ලෙස හැඳින්වේ.

දැන්. අපි හිතමු අපි thisවෙනත් ශ්‍රිතයක් ඇමතීමට පෙර පැහැදිලිවම සකසන ශ්‍රිතයක් සාදා එය .(තිත) ක්‍රියාකරු සමඟ අමතන්න

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සහ =>කාර්යයන් effectively ලදායී ලෙස කරන්නේ මෙයයි. ඒවා වඩාත් සින්ටැක්ටික් සීනි වේ. barඉහත දක්වා ඇති ආකාරයටම අදෘශ්‍යමාන ශ්‍රිතයක් ඔවුන් effectively ලදායී ලෙස ගොඩනඟයි 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බැඳී කිරීමට වස්තුව ගම්ය වේ. එය කුමක් වුවත් තියෙන්නේ 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පවරා ඇති නව නොපෙනෙන ශ්රිතයක් නව නොපෙනෙන ශ්රිතය හා නැවත b. b()එය සැමවිටම ඇති ආකාරයටම 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” දේපලයි.

“MyObj” වස්තුවට “getMyName” යනුවෙන් ක්‍රමයක් තිබේ නම්, “get” යන ජාවාස්ක්‍රිප්ට් යතුර “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>

ප්‍රතිදානය: රූප විස්තරය මෙහි ඇතුළත් කරන්න

එබැවින් ඉහත උදාහරණයෙන්, 'මෙම' මූල පදය myObj හා සම්බන්ධ නව සන්දර්භයක් වෙත යොමු වන බව අපට පෙනී ගිය අතර, MyObject හි වස්තුවට මූලාකෘති දාමයක් ද ඇත.

අපි තවත් උදාහරණයක් විසි කරමු:

<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>

ප්‍රතිදානය: රූප විස්තරය මෙහි ඇතුළත් කරන්න

දැන් අපි විෂය පථය, ස්වයං, IIFE සහ මෙය හැසිරෙන ආකාරය තේරුම් ගනිමු

       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"

    ඉහත දී මෙය 'myCar' වස්තුවට බැඳී ඇත

  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. 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.