වසා දැමීමෙන් උපුටා ගැනීමක් අනුගමනය කරයි : මයිකල් බොලින් විසින් නිර්වචනය කළ මාර්ගෝපදේශය . එය ටිකක් දිග පෙනුමක් ඇති නමුත් එය විශාල තීක්ෂ්ණ බුද්ධියකින් සංතෘප්ත වේ. "උපග්රන්ථය B. නිතර වැරදියට වටහාගෙන ඇති ජාවාස්ක්රිප්ට් සංකල්ප" වෙතින්:
this
ශ්රිතයක් කැඳවූ විට අදහස් කරන්නේ කුමක්ද
පෝරමයේ ශ්රිතයක් අමතන විට foo.bar.baz()
, වස්තුව foo.bar
ග්රාහකය ලෙස හැඳින්වේ. ශ්රිතය හැඳින්වූ විට, එහි අගය ලෙස භාවිතා කරන්නේ ග්රාහකයයි this
:
var obj = {};
obj.value = 10;
/** @param {...number} additionalValues */
obj.addValues = function(additionalValues) {
for (var i = 0; i < arguments.length; i++) {
this.value += arguments[i];
}
return this.value;
};
// Evaluates to 30 because obj is used as the value for 'this' when
// obj.addValues() is called, so obj.value becomes 10 + 20.
obj.addValues(20);
ශ්රිතයක් කැඳවූ විට පැහැදිලි ග්රාහකයක් නොමැති නම්, ගෝලීය වස්තුව ග්රාහකයා බවට පත්වේ. 47 වන පිටුවේ “goog.global” හි විස්තර කර ඇති පරිදි, වෙබ් බ්රව්සරයක ජාවාස්ක්රිප්ට් ක්රියාත්මක කරන විට කවුළුව යනු ගෝලීය වස්තුවයි. මෙය පුදුම සහගත හැසිරීම් වලට තුඩු දෙයි:
var f = obj.addValues;
// Evaluates to NaN because window is used as the value for 'this' when
// f() is called. Because and window.value is undefined, adding a number to
// it results in NaN.
f(20);
// This also has the unintentional side effect of adding a value to window:
alert(window.value); // Alerts NaN
වුවත් obj.addValues
සහ f
එම කාර්යය වෙත යොමු වන්න, ඔවුන් ලබන්නා වටිනාකම එක් එක් ඇමතුමක් දී වෙනස් නිසා හමු වූ අවස්ථාවේ දී වෙනස් හැසිරීමක්. මෙම හේතුව නිසා, යොමු කරන ශ්රිතයක් ඇමතීමේදී this
, එය this
කැඳවූ විට එය නිවැරදි අගයක් ඇති බව සහතික කිරීම වැදගත්ය . පැහැදිලිව කිවහොත්, this
ක්රියාකාරී ශරීරයේ සඳහන් කර නොමැති නම් , f(20)
සහ හැසිරීමobj.addValues(20)
සමාන වේ.
කාර්යයන් ජාවාස්ක්රිප්ට් හි පළමු පන්තියේ වස්තු වන බැවින් ඒවාට ඔවුන්ගේම ක්රම තිබිය හැකිය. සියළුම ශ්රිතයන්ට ක්රමවේදයන් ඇති call()
අතර apply()
එමඟින් ශ්රිතය කැඳවීමේදී ග්රාහකය (එනම්, යොමු කරන වස්තුව this
) නැවත අර්ථ දැක්වීමට හැකි වේ. ක්රම අත්සන් පහත පරිදි වේ:
/**
* @param {*=} receiver to substitute for 'this'
* @param {...} parameters to use as arguments to the function
*/
Function.prototype.call;
/**
* @param {*=} receiver to substitute for 'this'
* @param {Array} parameters to use as arguments to the function
*/
Function.prototype.apply;
සටහන අතර එකම වෙනස call()
හා apply()
බවයි call()
බැවින්ද, මෙම උත්සවය පරාමිතීන් තනි තර්ක ලෙස ලැබෙන apply()
තනි මාලාවක් ලෙස ලැබෙන:
// When f is called with obj as its receiver, it behaves the same as calling
// obj.addValues(). Both of the following increase obj.value by 60:
f.call(obj, 10, 20, 30);
f.apply(obj, [10, 20, 30]);
පහත සඳහන් ඇමතුම්, සමාන බැවින් f
හා obj.addValues
සමාන කාර්යයක් වෙත යොමු වන්න:
obj.addValues.call(obj, 10, 20, 30);
obj.addValues.apply(obj, [10, 20, 30]);
කෙසේ වෙතත්, ලබන්නාගේ තර්කය නිශ්චිතව දක්වා නොමැති විට එය ආදේශ කිරීම සඳහා තමන්ගේම ග්රාහකයේ වටිනාකම call()
හෝ apply()
භාවිතා නොකරන බැවින් , පහත සඳහන් දෑ ක්රියා නොකරනු ඇත:
// Both statements evaluate to NaN
obj.addValues.call(undefined, 10, 20, 30);
obj.addValues.apply(undefined, [10, 20, 30]);
වටිනාකම this
හැකි විය කවදාවත් null
හෝ undefined
උත්සවයකට නමින් වන විට පමණි. ලබන්නා වෙත හෝ ලබා දෙන විට null
හෝ undefined
ලබා දෙන විට , ගෝලීය වස්තුව ඒ වෙනුවට ලබන්නා සඳහා වටිනාකම ලෙස භාවිතා කරයි. එමනිසා, පෙර කේතයට ගෝලීය වස්තුවට නම් කළ දේපලක් එක් කිරීමේ අනවශ්ය අතුරු ආබාධ ඇත .call()
apply()
value
ශ්රිතයක් පවරා ඇති විචල්යය පිළිබඳ දැනුමක් නොමැති යැයි සිතීම ප්රයෝජනවත් විය හැකිය. මෙය අර්ථ දැක්වීමේදී නොව ශ්රිතය කැඳවූ විට මෙහි වටිනාකම බැඳී පවතිනු ඇතැයි යන අදහස ශක්තිමත් කිරීමට මෙය උපකාරී වේ.
නිස්සාරණයේ අවසානය.
a
ආග්ස් පෙළක් සඳහා ඉල්ලුම් කිරීමට සහ ආග්c
තීරු සඳහා කැඳවීමට සිතන්න .