ෆැබ්රේෂියෝගේ පිළිතුර ක්රියාත්මක වේ; නමුත් මට අවශ්ය වූයේ අඩු තාක්ෂණික දෙයකින් ඔහුගේ පිළිතුර සම්පුර්ණ කිරීමටය, එය අසමමුහුර්තතාව පිළිබඳ සංකල්පය පැහැදිලි කිරීමට උපකාරී වන ප්රතිසමයක් කෙරෙහි අවධානය යොමු කරයි .
ප්රතිසමයක් ...
ඊයේ, මම කරමින් සිටි කාර්යයට සගයකුගෙන් යම් තොරතුරු අවශ්ය විය. මම ඔහුව ඔසවා තැබුවෙමි. සංවාදය ගිය ආකාරය මෙන්න:
මට : හායි බොබ්, මම හිතන්නේ අපි දැන සිටිය යුතු foo 'ඈ ද බාර් ඈ පසුගිය සතියේ. ජිම්ට ඒ පිළිබඳ වාර්තාවක් අවශ්ය වන අතර ඒ පිළිබඳ විස්තර දන්නේ ඔබ පමණි.
බොබ් : ෂුවර් දෙයක්, නමුත් මට විනාඩි 30 ක් පමණ ගත වේවිද?
මම : ඒක නියමයි බොබ්. ඔබට තොරතුරු ලැබුණු විට මට නැවත මුද්දක් දෙන්න!
මේ අවස්ථාවේදී, මම දුරකථනය එල්ලා තැබුවෙමි. මගේ වාර්තාව සම්පුර්ණ කිරීම සඳහා මට බොබ්ගෙන් තොරතුරු අවශ්ය වූ හෙයින්, මම වාර්තාව අතහැර කෝපි කෝප්පයක් ගැනීමට ගියෙමි, පසුව මම ඊමේල් කිහිපයක් අල්ලා ගතිමි. මිනිත්තු 40 කට පසු (බොබ් මන්දගාමී), බොබ් නැවත අමතා මට අවශ්ය තොරතුරු ලබා දුන්නේය. මේ අවස්ථාවේ දී, මට අවශ්ය සියලු තොරතුරු මා සතුව තිබූ බැවින්, මගේ වාර්තාව සමඟ මගේ වැඩ කටයුතු නැවත ආරම්භ කළෙමි.
ඒ වෙනුවට සංවාදය මේ ආකාරයට සිදුවී ඇත්දැයි සිතා බලන්න;
මට : හායි බොබ්, මම හිතන්නේ අපි දැන සිටිය යුතු foo 'ඈ ද බාර් ඈ පසුගිය සතියේ. ජිම්ට අවශ්ය වන්නේ ඒ පිළිබඳ වාර්තාවක් වන අතර ඒ පිළිබඳ විස්තර දන්නේ ඔබ පමණයි.
බොබ් : ෂුවර් දෙයක්, නමුත් මට විනාඩි 30 ක් පමණ ගත වේවිද?
මම : ඒක නියමයි බොබ්. මම බලා ඉන්නම්.
මම එහි ඉඳගෙන බලා සිටියෙමි. සහ බලා සිටියේය. සහ බලා සිටියේය. විනාඩි 40 ක්. බලා සිටීම හැර වෙන කිසිවක් නොකරයි. අවසානයේදී, බොබ් මට තොරතුරු ලබා දුන්නේය, අපි එල්ලා තැබුවෙමි, මම මගේ වාර්තාව සම්පූර්ණ කළෙමි. නමුත් මට විනාඩි 40 ක produc ලදායිතාව අහිමි විය.
මෙය අසමමුහුර්ත එදිරිව සමමුහුර්ත හැසිරීමයි
අපගේ ප්රශ්නයේ සියලුම උදාහරණ වල සිදුවන්නේ මෙයයි. පින්තූරයක් පූරණය කිරීම, තැටියෙන් පිටත ගොනුවක් පැටවීම සහ AJAX හරහා පිටුවක් ඉල්ලා සිටීම යන සියල්ලම මන්දගාමී මෙහෙයුම් වේ (නවීන පරිගණකකරණයේ සන්දර්භය තුළ).
මෙම මන්දගාමී මෙහෙයුම් අවසන් වන තෙක් බලා සිටිනවා වෙනුවට , ජාවාස්ක්රිප්ට් ඔබට ඇමතුම් ආපසු ගැනීමේ ශ්රිතයක් ලියාපදිංචි කිරීමට ඉඩ දෙයි, එය මන්දගාමී ක්රියාකාරිත්වය අවසන් වූ විට ක්රියාත්මක වේ. කෙසේ වෙතත්, මේ අතරතුර, ජාවාස්ක්රිප්ට් වෙනත් කේත ක්රියාත්මක කිරීම දිගටම කරගෙන යනු ඇත. මන්දගාමී ක්රියාකාරිත්වය සම්පූර්ණ වන තෙක් බලා සිටින අතරතුර ජාවාස්ක්රිප්ට් වෙනත් කේතයන් ක්රියාත්මක කිරීම හැසිරීම අසමමුහුර්ත කරයි. වෙනත් කේතයක් ක්රියාත්මක කිරීමට පෙර ජාවාස්ක්රිප්ට් මෙහෙයුම අවසන් වන තෙක් බලා සිටියේ නම්, මෙය සමමුහුර්ත හැසිරීමක් වනු ඇත .
var outerScopeVar;
var img = document.createElement('img');
// Here we register the callback function.
img.onload = function() {
// Code within this function will be executed once the image has loaded.
outerScopeVar = this.width;
};
// But, while the image is loading, JavaScript continues executing, and
// processes the following lines of JavaScript.
img.src = 'lolcat.png';
alert(outerScopeVar);
ඉහත කේතය තුළ, අපි ජාවාස්ක්රිප්ට් පූරණය lolcat.png
කරන ලෙස ඉල්ලා සිටිමු . මෙම මන්දගාමී මෙහෙයුම සිදු වූ පසු ඇමතුම් ලබා ගැනීමේ කාර්යය ක්රියාත්මක වනු ඇත, නමුත් මේ අතරතුර, ජාවාස්ක්රිප්ට් විසින් ඊළඟ කේත පේළි සැකසීම දිගටම කරගෙන යනු ඇත; එනම් alert(outerScopeVar)
.
අනතුරු ඇඟවීම පෙන්වන්නේ මේ නිසා ය undefined
; සිට alert()
වෙනුවට ප්රතිරූපය පටවා ඇත පසු වඩා, වහාම සකස් කර ඇත.
අපගේ කේතය විසින් අදාල කරුණ නිවැරදි කිරීමට නම්, අපි කළ යුතු දේ මෙම පියවර alert(outerScopeVar)
කේතය බවට ද callback උත්සවය. මෙහි outerScopeVar
ප්රති consequ ලයක් ලෙස ගෝලීය විචල්යයක් ලෙස ප්රකාශිත විචල්යය අපට තවදුරටත් අවශ්ය නොවේ .
var img = document.createElement('img');
img.onload = function() {
var localScopeVar = this.width;
alert(localScopeVar);
};
img.src = 'lolcat.png';
ජාවාස්ක්රිප්ට් හි සමහර කේත නිර්වචනය කිරීමට ඇති එකම ක්රමය එය වන නමුත් පසුව එය ක්රියාත්මක නොකරන බැවින් ඔබට සැමවිටම ඇමතුමක් ලබා දෙනු ඇත.
එමනිසා, අපගේ සියලු උදාහරණ වලදී, function() { /* Do something */ }
නැවත කැඳවීම; සියලු උදාහරණ නිවැරදි කිරීමට , අප කළ යුතුව ඇත්තේ මෙහෙයුමේ ප්රතිචාරය අවශ්ය කේතය එහි ගෙනයාම පමණි!
* තාක්ෂණික වශයෙන් ඔබටද භාවිතා eval()
කළ හැකිය, නමුත් eval()
මේ සඳහා නපුරකි
මගේ අමතන්නා බලා සිටින්නේ කෙසේද?
ඔබට දැනට මේ හා සමාන කේත කිහිපයක් තිබිය හැකිය;
function getWidthOfImage(src) {
var outerScopeVar;
var img = document.createElement('img');
img.onload = function() {
outerScopeVar = this.width;
};
img.src = src;
return outerScopeVar;
}
var width = getWidthOfImage('lolcat.png');
alert(width);
කෙසේ වෙතත්, එය return outerScopeVar
වහාම සිදුවන බව අපි දැන් දනිමු ; onload
ඇමතුම් ආපසු ගැනීමේ ශ්රිතය විචල්යය යාවත්කාලීන කිරීමට පෙර . මෙය getWidthOfImage()
නැවත පැමිණීමට undefined
සහ undefined
අවදියෙන් සිටීමට හේතු වේ .
මෙය නිවැරදි කිරීම සඳහා, ඇමතුම් getWidthOfImage()
ලබා ගැනීම ලියාපදිංචි කිරීම සඳහා ශ්රිත ඇමතුමට ඉඩ දිය යුතු අතර, පළල පිළිබඳ අනතුරු ඇඟවීම එම ඇමතුම තුළ තිබිය යුතුය.
function getWidthOfImage(src, cb) {
var img = document.createElement('img');
img.onload = function() {
cb(this.width);
};
img.src = src;
}
getWidthOfImage('lolcat.png', function (width) {
alert(width);
});
... පෙර මෙන්, ගෝලීය විචල්යයන් ඉවත් කිරීමට අපට හැකි වූ බව සලකන්න (මේ අවස්ථාවේ දී width
).