ES6 හි “var” මූල පදය භාවිතා කිරීමට හේතුවක් තිබේද?


276

බාබෙල් ගේ ES6 මඟ පවසයි:

letඅලුත් ය var.

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

මට varES6 කේතයේ භාවිතා කිරීමට කිසිදු හේතුවක් නොපෙනේ. සම්පූර්ණ ශ්‍රිතයට ලබා දී ඇති විචල්‍යයක් විෂය පථයට ගෙන ඒමට ඔබට අවශ්‍ය වුවද let, ප්‍රකාශය ශ්‍රිත කොටසේ ඉහළින් තැබීමෙන් ඔබට එය කළ හැකිය var, සැබෑ විෂය පථය දැක්වීමට ඔබ කෙසේ හෝ කළ යුත්තේ එයයි . ඔබට forබ්ලොක් එකක හෝ වෙනත් දෙයකට වඩා සියුම් ලෙස විෂය පථයක් කිරීමට අවශ්‍ය නම් , ඔබටත් එය කළ හැකිය.

එබැවින් මගේ සහජ බුද්ධිය වන්නේ varES6 කේතය ලිවීමේදී සම්පූර්ණයෙන්ම භාවිතා කිරීම නතර කිරීමයි.

මගේ ප්‍රශ්නය නම්, මම මේ ගැන වැරදිද? varවඩා සුදුසු නීත්‍යානුකූල නඩුවක් letතිබේද?


3
මම තවම මෙය උත්සාහ කර නැත (මම තවමත් ES6 කේතය ලියන්නේ නැති නිසා), නමුත් varමෙම විචල්‍යය සමස්ත ශ්‍රිතයටම පරිලෝකනය කිරීමට අදහස් කරන බව සවි indic ් indic ාණික දර්ශකයක් ලෙස භාවිතා කිරීම ප්‍රයෝජනවත් “ස්වයං ලේඛනගත කිරීමේ” සම්මුතියක් විය හැකි බව පෙනේ. .
jfriend00

11
ඔබ letශ්‍රිතයක ඉහළින්ම ප්‍රකාශයක් තැබුවහොත් , එය සමස්ත ශ්‍රිතයටම විෂය පථය කිරීමට ඔබ අදහස් කළ බව පැහැදිලිය. භාවිතා varකිරීම එය ඉහළින්ම ස්ථානගත කරනවාට වඩා පැහැදිලි යැයි මම නොසිතමි .
callum

13
අවංකවම, මම varතවමත් විශ්වාස කරන්නේ එකම හේතුව පසුපසට-ගැළපුම බවයි. එය එසේ නොවූයේ නම්, ඔවුන් varමුලුමනින් ම ඉවත් කරනු ඇත , නැතහොත් කිසි විටෙකත් letමුලින් හඳුන්වා නොදෙනු ඇත , ඒ වෙනුවට අර්ථකථනය varඑය තර්ක කළ හැකි දෙයට වෙනස් කළ යුතුය.
ජෝර්ග් ඩබ් මිට්ටාග්

2
AyRayToal කයිල් සිම්ප්සන් පවසන දෙයින් 97% ක් සමඟ මම එකඟ වෙමි, නමුත් ඔහු දිගටම භාවිතා කිරීමට හේතු varමට සිහින් බවක් පෙනේ, තුන්වන ආකාරයේ විචල්‍යයක් පැනීමට අවශ්‍ය තරම් ප්‍රමාණවත් නොවේ. ඔබට letශ්‍රිතයේ මුදුනේ තැබීමෙන් සරලවම එය ශ්‍රිතයක් තුළට ගෙන යා හැකිය , එය varබ්ලොක් එකක ලිවීමට වඩා පැහැදිලිව පෙනේ (එය එම බ්ලොක් එකෙන් එසවීම සඳහා ඔබට එය බ්ලොක් එකෙන් පිටත භාවිතා කළ හැකිය - අමුතුයි). ඔහු අනතුරු අඟවන්නේ ඔබ letශ්‍රිතයක් සඳහා විෂය පථයක් යොමු කරන්නේ නම් “එය හුදෙක් වාක්‍ය ඛණ්ඩයට වඩා වෙනස සං als ා කරන ස්ථානයක්” බවයි, නමුත් මම හිතන්නේ එය හොඳ දෙයක්.
callum

2
AyRayToal මමත් එම ලිපිය කියෙව්වා (මෙම සාකච්ඡාව කියවීමට පෙර) සහ ඔහුගේ දුර්වල නඩුව ගැන මම ඇත්තෙන්ම කලකිරීමට පත්වීමි var. තබා ගැනීම සඳහා ඔහු ඉදිරිපත් කරන උදාහරණ varව්‍යාජ එකක් ලෙස පෙනේ - ඒවා පදනම් වී ඇත්තේ දැඩි කේතීකරණ දෝෂ මත ය. යමෙකුට එයින් ගැලවීමට ඉඩ දෙන භාෂා කාර්යයන් භාවිතා කරනවාට වඩා දෝෂයකට ගොදුරු වී එවැනි දෝෂ නිවැරදි කිරීමට බල කිරීම වඩා හොඳය! මීළඟට කුමක් ද, බිඳවැටීම් වලක්වා ගැනීම සඳහා සෑම දෙයක්ම උත්සාහයෙන් / අල්ලා ගැනීමට උපදෙස් දෙන්න? එම සබැඳියේ ඉතිරි කොටස හොඳයි, නමුත් මම එම විශේෂිත කොටස සමඟ කිසිසේත් එකඟ නොවෙමි.
මරේ

Answers:


222

ඩග් Crockford සාකච්ඡා letදී මෙම ස්ථානයේ ඔහුගේ කතාව, "තුළ වඩා වඩා හොඳ අමතර කොටස් ".

කාරණය වන්නේ, letවරදවා වටහාගැනීමේ ප්‍රභවයක් මග හැරීමයි. වාරණ-විෂය පථය සහිත භාෂා විසින් සකසා ඇති අපේක්ෂාවන් සහිත ක්‍රමලේඛකයින් සඳහා. ඒ varඇත කාර්යය විෂය පථය (එය මෙම උත්සවයට පුරා දැකගත බව, විචල්ය ප්රකාශ) එය වුවත් බලයි එය වගේ වාරණ විෂය පථය .

var යන්ත්‍රයෙන් ජනනය කරන ලද කේතය වැනි ආන්තික අවස්ථාවකදී තවමත් ප්‍රයෝජනවත් විය හැකි නමුත් මම එහි දැඩි ලෙස දිගු කරමි.

( constද නව වන අතර, වාරණ විෂය පථය වේ. පසු let x = {'hi': 'SE'}ඔබට නැවත පැවරීම සිදු කළ හැකි xඅතර, පසුව, const y = xඔබ නැවත පැවරීම සිදු කළ නොහැක y. එය අහම්බෙන් ඔබ යටතේ සිට වෙනස් යමක් කරයි සිට බොහෝ විට preferrable වැඩක් බවයි. එහෙත්, පැහැදිලි කිරීමට, ඔබ තවමත් වස්තුව වෙනස් කළ හැක y.hi = 'SO'ඔබ මිස එය කැටි කරන්න.)

යථාර්ථවාදීව, ඔබගේ හැඟීම අයිතිය ES6 සඳහා මත ය: සම්පාදනය letහා const. භාවිතා කිරීම නවත්වන්න var.

( "වඩා හොඳ කොටස්" හි තවත් කාර්ය සාධනයක දී, ඩග් පවසන්නේ ගැටළු නිරාකරණය=== කරනවාට වඩා එකතු කළේ මන්ද යන්නයි . සමහර "පුදුම සහගත" ප්‍රති results ==== ලබා දෙයි, එබැවින් සම්මත කර ගන්න ===.)


හෙළි කරන උදාහරණයක්

මොසිල්ලා සංවර්ධක ජාලයvar අපේක්ෂිත පරිදි ක්‍රියා නොකරන තැන උදාහරණයක් සපයයි . ඔවුන්ගේ උදාහරණය යථාර්ථවාදී එකක් වන අතර එය onclickහසුරුවන්නන් වෙබ් පිටුවක තබයි. මෙන්න කුඩා පරීක්ෂණ අවස්ථාවක්:

var a = [];
(function () {
   'use strict';
   for (let i = 0; i < 5; ++i) { // *** `let` works as expected ***
     a.push( function() {return i;} );
   }
} ());
console.log(a.map( function(f) {return f();} ));
// prints [0, 1, 2, 3, 4]

// Start over, but change `let` to `var`.
// prints [5, 5, 5, 5, 5]

varසියලු ලූප පුනරාවර්තන එකම ශ්‍රිත-පරිමාණ iවිචල්‍යය බෙදා ගන්නා හෙයින් 5, ලූපය අවසන් වූ පසු එහි අගය ඇත.


තවත් කීමේ උදාහරණයක්

function f(x) {
    let y = 1;
    if (x > 0) {
        let y = 2;  // `let` declares a variable in this block
    }
    return y;
}
[f(1), f(-1)]  // --> [1, 1]

// Start over, but change `let` to `var`.
// --> [2, 1]

letබ්ලොක්-ස්කෝප් විචල්‍යයන් ප්‍රකාශ කරයි. varශ්‍රිතය පුරා එකම විචල්‍යයක් සඳහන් කිරීමෙන් අපව ව්‍යාකූල කරයි.


6
ඔහු == වෙනුවට === දරුකමට හදා ගැනීම පිළිබඳ එකම පිළිතුර ලබා දෙයි. දෙවැන්න කැඩී ඇති නමුත් ඊඑස් ප්‍රමිති කමිටුව එය වෙනස් කිරීමට අකමැති වූ නිසා ඔවුන් එකතු කළේ === එහි තේරුම කුමක්දැයි නිශ්චිතවම විශ්වාස නැත. ==කිසිසේත් කැඩී නැත. එය සරලව අර්ථ දැක්විය හැක්කේ equality comparison using coersionපරීක්ෂා කරන්න github.com/getify/You-Dont-Know-JS/blob/master/…
AmmarCSE

14
Im අමර්සීඑස්ඊ යනු ව්‍යංග බලහත්කාරයන් පිළිබඳ පිටු 39 ක අපූරු ලේඛනයකි. වැඩසටහන්කරණයේදී ඒ සියල්ල මතකයේ තබා ගත හැක්කේ කාටද? ඩග් යන්නෙන් අදහස් කළේ stackoverflow.com/a/359509/1682419 හි සාරාංශගත කර ඇති පරිදි , කෙටියෙන් කිවහොත්, අප අනුමාන කළ ප්‍රමාණයට වඩා වටිනාකම් වර්ග වෙනස් වන විට එය ලබා ගැනීම පහසුය. ඔබට මේ සියල්ල පුරෝකථනය කළ හැකිද? [ '1.0' == 1.0, [1.0] == 1.0, [1.0] == '1.0', ['1.0'] == 1.0, [null] == '', [null] == 'null', '00' == false, [] == [], [] == 0, [] == '', [] == false, [] == true, [010] - [4] == ' 4.0 ', !![0], !![1], [0] == true, [1] == true, 1 == [[1]], 0 == [[0]], '1' == [1] ]
ජෙරී 101

2
හරි, එම උදාහරණ බොහොමයකට අරාව ක්‍රියාත්මක වේ. ඔබ ටෝස්ට්‍රිං සහ එය වස්තු සඳහා ක්‍රියාත්මක කළ ආකාරය සොයා බැලූ විට ප්‍රති result ලය තේරුම් ගැනීම පහසුය . කෙසේ වෙතත්, එය බිඳී යාමෙන් අදහස් කරන්නේ නම් එය පැමිණෙන්නේ කොතැනින්දැයි මට සම්පූර්ණයෙන්ම පෙනේ. :-)
අම්මර්සීඑස්ඊ

3
විකෘති නොවන සෑම විටම කොන්ස්ට් භාවිතා නොකරන්නේ ඇයි? මා මෙයින් අදහස් කරන්නේ, සැබෑ තේරීමක් එය අතර නෑ letසහ varඒ වෙනුවට අතර let, varසහconst
shabunc

4
varසැලසුම් කර ඇති පරිදි ක්‍රියා කරයි, නමුත් කීදෙනෙකු අපේක්ෂා කරනවාද යන්න නොවේ. එය භාවිත කිරීමේ දෝෂයක් මිස ක්‍රියාත්මක කිරීමේ දෝෂයක් නොවේ.
ජෙරී 101

14

ඔබ නිවැරදි කේතයක් ලියා ඇත්නම්, ඔබට බොහෝ ප්‍රකාශයන් කිසිදු අර්ථකථන වෙනසක් නොමැතිව varප්‍රකාශ බවට පත් කිරීමට හැකි වනු ඇත let.

letහඳුනා ගැනීම දෘශ්‍යමාන වන විෂය පථය අඩු කරන නිසා එය වඩාත් සුදුසුය. පළමු භාවිතයේ දී විචල්‍යයන් ආරක්ෂිතව ප්‍රකාශ කිරීමට එය අපට ඉඩ දෙයි.

constවඩා සුදුසුය let. ඔබට යොමු කිරීමක් විකෘති කිරීමට අවශ්‍ය නොවන්නේ නම් constප්‍රකාශයක් භාවිතා කරන්න . letඒකීයකරණය කරන ලද විචල්‍යයන් පැවතීම අඩු කිරීම සහ කේතය සාමාන්‍යයෙන් තර්ක කිරීම පහසු කිරීම සමඟින් මෙහි සියලු වාසි ඇත. ඔබට යොමු කිරීමක් විකෘති කිරීමට අවශ්‍ය දැයි ඔබට විශ්වාස නැත්නම්, එසේ කිරීමට අවශ්‍ය බව constඔබ සොයා ගන්නා තෙක් එය ප්‍රකාශ කරන්න.


5

මම හිතන්නේ නැහැ ඔබ වැරදියි කියා නමුත් var භාවිතා කිරීම සඳහා අවවාද තිබේ. අත්‍යවශ්‍යයෙන්ම, letජාවාස්ක්‍රිප්ට් හි මෝඩකම, විශේෂයෙන් නම් කිරීමේ ගැටුම් සමඟ සංවර්ධකයින්ට උදව් විය යුතුය. var, එය වසා දැමීමේ ශ්‍රිත විෂය පථයට යාමට අවශ්‍ය බැවින් එයට විශාල විෂය පථයක් ඇති බව පෙනේ. ශ්‍රිතයක් තුළ ඇති කොටසක විෂය පථය තුළ ඔබට තාවකාලික විචල්‍යයක් ලබා ගැනීමට අවශ්‍ය වන විට මෙන් ඔබට var අවශ්‍ය වන අවස්ථා තිබේ, එසේ නොමැති නම්, letvar ට වඩා වැඩි කැමැත්තක් දැක්වීම ගැටුම් නම් කිරීමේ සංවර්ධකයින්ට උපකාරී වේ. සැහැල්ලු සටහනක, එය ES6 හඳුන්වා දුන් කාලයයි let.


3
varබ්ලොක් එකක තාවකාලික කාල පරාසයක් මුළු ශ්‍රිතය තුළම ඇත. එය නොමඟ යවන ලක්ෂණයකි.
ජෙරී 101

2

Es6 හි "ඉඩ" පමණක් භාවිතා කළ යුතු බවට මම එකඟ වෙමි. AFIK, “ඉඩ දෙන්න” නැවත ප්‍රකාශ කිරීමෙන් දෝෂයක් ජනනය වේ (එය හොඳයි), “var” සමඟින් ඔබ හුදෙක් අගය ඉක්මවා යයි (es5 හි “දැඩි මාදිලිය” එයද බලා ගනී).


-5

let"විචල්‍යයට සමාන වීමට ඉඩ දෙන්න" යන්නයි. එය ප්‍රකාශයක්, වෙනත් වචන වලින් කිවහොත්, ආරම්භයක් සහ පැවරුමක්.

එය පවතින්නේ constඇත්ත වශයෙන්ම "නියතය" යන්නෙන් අදහස් වන විචල්‍යයට ප්‍රතිවිරුද්ධවය.

තවත් සමහර භාෂාවන් ප්‍රකාශ කරන විට සත්‍ය වස්තුව වෙනුවට උපසර්ගයක් භාවිතා කරයි (උදා: def“ශ්‍රිතය අර්ථ දැක්වීම” සඳහා වූ කෙටි යෙදුමකි - “ඩෙෆ්” යන්නෙහි ලක්ෂ්‍යය සම්පූර්ණයෙන්ම මග හැරී ඇත.

Let මෙම අර්ථකථන නොගැලපීම ජාවාස්ක්‍රිප්ට් වෙත එක් කරයි.

තර්කානුකූලව, ඔබට නියත සමාන දෙයකට ඉඩ දිය හැකිය, මන්ද “ඉඩ දෙන්න” යන පදයේ කාර්යය වන්නේ මතකය පැවරීමයි.

ගැටළුව පැන නගින්නේ varමීට පෙර යතුරුපදය හඳුන්වා දුන් නිසාය const, එබැවින් පසුපසට ගැළපුම මඟින් නියම කරනුයේ varවිචල්‍යයක් නොවේ. (නියත අගයක් පැවරීමටද එය භාවිතා කළ හැකිය.)

එබැවින් letවැරදි ස්ථානයක හඳුන්වා දීම . වචනාර්ථයෙන්, මෙය වැරදියි කියා අපට මතක ඇති බව තහවුරු කර ගැනීම සඳහා, ඔවුන් letඑදිරිව එදිරිව ශබ්දකෝෂ විෂය පථය වෙනස් කිරීමට තීරණය varකළ අතර, නිදොස් කිරීමේදී අපගේ මනසෙහි නොගැලපීම ප්‍රමුඛ වේ.

වෙනත් වචන වලින් කිවහොත්, letපවතින්නේ ජාවාස්ක්‍රිප්ට් ඕනෑවට වඩා ස්ථාවර යැයි මිනිසුන් (භාෂා නඩත්තු කරන්නන් අදහස් කරන නිසා), එහි සියලු මෝඩකම් සහ මුග්ධයන් ප්‍රගුණ කර ඇති නිසා, වැඩි ආශාවක් ඇති බැවිනි.

පැති සටහන, varඔබට කියූ කොටස් වසා දැමීම් ලෙස සැලකීමට අවශ්‍ය නම් “ඊතල” කුට්ටි වල ක්‍රියා නොකරයි (මන්ද varඑය කුට්ටි වසා දැමීම් ලෙස සැලකීමට පෙර හඳුන්වා දුන් බැවිනි ), නමුත් letඑසේ නොවේ.


7
-1: අධ්‍යාපනික, උදව් නොකළ සහ මූලික වශයෙන් මතය පදනම් කරගත්.
ජොයෙල් මුලර්

fijiaaron මෙතන අපිත් එක්ක විහිළු කරනවා.
ජෙරී 101

letජාවාස්ක්‍රිප්ට් හි එකම කාණ්ඩයේ වෙනත් මූල පදවල ස්වරයට පටහැනි බැවින් , ඔබ ශබ්දකෝෂ ස්වරූපයට අකමැති වීම ගැන මම අනුකම්පා කරමි . තවමත් මෙය ප්‍රශ්නයට පිළිතුරු නොදෙන අතර විශේෂයෙන් ම එය මනාව ඉදිරිපත් නොකෙරේ. Downvoted
Aluan Haddad

3
letවඩා සංකීර්ණ වීමට කැමති සංවර්ධකයින් පමණක් නොවේ. එය සැබවින්ම සිතාමතාම වඩාත් තේරුම් ගත හැකි ය, මන්ද ඔබ වර්‍ගයට වඩා ලූප-හා සමීප වන විට, වසා දැමීම var හි අවසාන අගය පවත්වා ගෙන යයි, නමුත් ඔබ එකම ඕවර් ලෙට්ස් කරන විට, ලූපයේ සෑම වැසීමක්ම ඉඩ දීම සඳහා තමන්ගේම වටිනාකමක් ඇත, a ඉහත උදාහරණය @ ජෙරී 101 විසින්
TKoL
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.