Var keyword හි අරමුණ කුමක්ද සහ මම එය භාවිතා කළ යුත්තේ කවදාද (හෝ එය අතහරින්න)?


1547

සටහන : මෙම ප්‍රශ්නය ECMAScript අනුවාදය 3 හෝ 5 හි දෘෂ්ටි කෝණයෙන් විමසන ලදි. ECMAScript 6 නිකුතුවේදී නව විශේෂාංග හඳුන්වාදීමත් සමඟ පිළිතුරු යල් පැන ගිය එකක් විය හැකිය.

varජාවාස්ක්‍රිප්ට් හි මූලික පදයෙහි ක්‍රියාකාරිත්වය හරියටම කුමක්ද සහ අතර ඇති වෙනස කුමක්ද

var someNumber = 2;
var someFunction = function() { doSomething; }
var someObject = { }
var someObject.someProperty = 5;

සහ

someNumber = 2;
someFunction = function() { doSomething; }
someObject = { }
someObject.someProperty = 5;

?

ඔබ එකක් භාවිතා කරන්නේ කවදාද, එය කරන්නේ ඇයි / කරන්නේ කුමක්ද?


3
විවිධ ප්‍රකාශන දම්වැල් දැමීමේදී, කොමාවකින් පසු නව රේඛාවක් තැබීම හැසිරීමට බලපාන්නේද? var x = 1, y = 2, [ආපසු] z = 3;
ඇල්ෆබ්‍රාවෝ

4
ඔබ තෝරාගත් විචල්‍ය නාමය කලින් අර්ථ දක්වා ඇති ගෝලීය විචල්‍යයක් නම් "var" භාවිතා කිරීමට අපොහොසත් වීමද ඔබව නිරාවරණය කරයි. මගේ ශෝකජනක ගමන මෙතැනින් බලන්න: stackoverflow.com/questions/16704014/…
ස්කොට් සී විල්සන්

5
@Ray Toal ගේ meloncard බ්ලොග් (අ කියවා වටිනවා) වෙත ගොස් ඇත blog.safeshepherd.com/23/how-one-missing-var-ruined-our-launch
Hephaestus

ක්‍රමලේඛන ගැටලුවක් සඳහා කවියක් මා පොළඹවනු ඇතැයි මම කිසි විටෙකත් නොසිතුවෙමි
ෆීලික්ස් ගග්නොන්-ග්‍රෙනියර්

1
Ib ගිබෝල්ට් නමුත් ප්‍රශ්න දිනය දෙස බලන්න, එය පැවසීම සඳහා 2009 ප්‍රශ්නයක් කැඳවීම තරමක් අසාධාරණ ය. නඩත්තු කිරීමේ වර්තමාන දිනයේ දී මෙන් එය තවමත් වලංගු වුවද, "නවීන ජේඑස්" කේතයක් එහි නොමැත.
ඇන්ඩ්‍රේ ෆිගියිරෙඩෝ

Answers:


1360

ඔබ ගෝලීය විෂය පථයේ සිටී නම් එතරම් වෙනසක් නැත. කැන්ගක්ස් කියවන්නපැහැදිලි කිරීම සඳහා පිළිතුර

ඔබ ශ්‍රිතයක සිටී නම් var දේශීය විචල්‍යයක් සාදනු ඇත, විචල්‍යය සොයා ගන්නා තෙක් හෝ ගෝලීය විෂය පථයට පහර දෙන තෙක් "කිසිදු වර්" විෂය පථය සොයා නොගනී (එම අවස්ථාවේදී එය එය නිර්මාණය කරයි):

// These are both globals
var foo = 1;
bar = 2;

function()
{
    var foo = 1; // Local
    bar = 2;     // Global

    // Execute an anonymous function
    (function()
    {
        var wibble = 1; // Local
        foo = 2; // Inherits from scope above (creating a closure)
        moo = 3; // Global
    }())
}

ඔබ පැවරුමක් නොකරන්නේ නම් ඔබ භාවිතා කළ යුත්තේ var:

var x; // Declare x

31
"ඇත්ත වශයෙන්ම එතරම් වෙනසක් නැත" == "වෙනසක් නැත"?
ඇලෙක්ස්

65
හොඳයි, ඇත්ත වශයෙන්ම ඔව්, වෙනසක් ඇත :) එම වෙනස වැදගත් ද යන්න තවත් ප්‍රශ්නයකි. මගේ පිළිතුර තවදුරටත් පහතින් බලන්න: stackoverflow.com/questions/1470488/…
kangax

4
මම හිතන්නේ එය ඇලෙක්ස්ගේ කාරණය විය හැකිය, ඒ නිසා ඔහු එය ලියා ඇත්තේ "සමාන" ක්‍රියාකරු භාවිතා කරමිනි!
ජේම්ස් බෙඩ්ෆර්ඩ්

18
එය හරියට රේල් තුවක්කුවකින් වෙඩි තැබීම හා සමානයි ... කෙනෙකුගේ විචල්‍යයට පෙර 'var' එකක් දැමීමට අමතක කර , විෂය පථයේ කොතැනක හෝ විචල්‍යයක් වෙනස් කිරීම අවසන් කරන්න ... ජාවා / සී / පයිතන් / යනාදිය ඒත්තු ගැන්වීමට උත්සාහ කරන්න. ජාවාස්ක්‍රිප්ට් වටින සංවර්ධකයා. හා! සී / සී ++ අන්තරායන් ඊට වෙනස්ව පෙනේ. ජාවාස්ක්‍රිප්ට් නිදොස් කිරීම ගැන සිතා බලන්න ... සමහර අය ඇත්ත වශයෙන්ම එසේ කරති. ජාවාස්ක්‍රිප්ට් හි ලියා ඇති බොහෝ කේත (සරල කේතයක් නොවේ, මතක තබා ගන්න) ...
ඇල්බස් ඩම්බල්ඩෝර්

6
ඔබ ගෝලීය විෂය පථයේ සිටී නම් වෙනසක් නැත. >> පහත පිළිතුරෙහි පැහැදිලි කර ඇති වෙනසක් ඇත
මැක්ස් කොරෙට්ස්කි

747

වෙනසක් තියෙනවා .

var x = 1 විචල්යය ප්රකාශ කරයි xවත්මන් විෂය පථයේ (ක්‍රියාත්මක කිරීමේ සන්දර්භය). ප්‍රකාශනය ශ්‍රිතයක දිස්වන්නේ නම් - දේශීය විචල්‍යයක් ප්‍රකාශයට පත් කෙරේ; එය ගෝලීය විෂය පථයේ නම් - ගෝලීය විචල්‍යයක් ප්‍රකාශයට පත් කෙරේ.

x = 1අනෙක් අතට, හුදෙක් දේපල පැවරුමකි. එය මුලින්ම උත්සාහ කරන්නේ xවිෂය පථයට එරෙහිව විසඳීමට ය . එය එම විෂය පථයේ ඕනෑම තැනක සොයාගත හොත්, එය පැවරුම සිදු කරයි; එය සොයාගත නොහැකි නම් x, එය xගෝලීය වස්තුවක් මත දේපළ නිර්මාණය කරයි (එය විෂය පථයේ ඉහළ මට්ටමේ වස්තුවකි).

දැන්, එය ගෝලීය විචල්‍යයක් ප්‍රකාශ නොකරන බව සලකන්න, එය ගෝලීය දේපලක් නිර්මාණය කරයි.

මේ දෙක අතර වෙනස සියුම් වන අතර විචල්‍ය ප්‍රකාශන මගින් ගුණාංග නිර්මාණය වන බව ඔබ තේරුම් නොගන්නේ නම් එය ව්‍යාකූල විය හැකිය (විචල්‍ය වස්තුවක් මත පමණක්) නිර්මාණය කරන බවත්, ජාවාස්ක්‍රිප්ට් හි ඇති සෑම දේපලකටම (හොඳයි, ඊසීඑම්එස්ක්‍රිප්ට්) ඒවායේ ගුණාංග විස්තර කරන ඇතැම් ධජ ඇති බවත් - ReadOnly, DontEnum සහ DontDelete.

විචල්ය ප්රකාශනය DontDelete ධජය සමඟ දේපල නිර්මාණය කරන බැවින්, var x = 1සහ අතර වෙනසx = 1 (ගෝලීය විෂය පථය තුළ ක්රියාත්මක කරන විට) අතර වෙනස වන්නේ කලින් පැවති විචල්ය ප්රකාශනය - ඩොන්ට් ඩීලීට් කළ හැකි දේපල නිර්මාණය කරන අතර දෙවැන්න එසේ නොවේ. එහි ප්‍රති consequ ලයක් ලෙස, මෙම ව්‍යංග පැවරුම හරහා නිර්මාණය කරන ලද දේපල පසුව ගෝලීය වස්තුවෙන් මකා දැමිය හැකි අතර, කලින් ඇති දේ - විචල්‍ය ප්‍රකාශනය හරහා නිර්මාණය කරන ලද - මකා දැමිය නොහැක.

නමුත් මෙය ඇත්ත වශයෙන්ම න්‍යායක් පමණක් වන අතර ප්‍රායෝගිකව මේ දෙක අතර ඊටත් වඩා වෙනස්කම් තිබේ , ක්‍රියාත්මක කිරීමේ විවිධ දෝෂ හේතුවෙන් (IE වැනි).

ඒ සියල්ල අර්ථවත් කරයි යැයි සිතමු :)


[2010/12/16 යාවත්කාලීන කරන්න]

ES5 හි (ECMAScript 5; මෑතකදී ප්‍රමිතිගත, භාෂාවේ 5 වන සංස්කරණය) ඊනියා “දැඩි මාදිලියක්” ඇත - තෝරාගත් භාෂා මාදිලියකි, එය ප්‍රකාශයට පත් නොකළ පැවරුම්වල හැසිරීම තරමක් වෙනස් කරයි. දැඩි ප්‍රකාරයේදී, ප්‍රකාශයට පත් නොකළ හඳුනාගැනුමකට පැවරීම විමර්ශන දෝෂයකි . මේ සඳහා හේතුව වූයේ අහඹු පැවරුම් අල්ලා ගැනීම, නුසුදුසු ගෝලීය දේපල නිර්මාණය කිරීම වැළැක්වීම ය. සමහර නව බ්‍රව්සර් දැනටමත් දැඩි මාදිලිය සඳහා ආධාරක රෝල් කිරීම ආරම්භ කර ඇත. උදාහරණයක් ලෙස, මගේ සංයුක්ත වගුව බලන්න .


මම නිවැරදිව සිහිපත් කළහොත්, deleteවර්‍ගයෙන් ප්‍රකාශිත විචල්‍යයක් යම්කිසි evalහැක් කිරීමකින් ලබා ගත හැකි ක්‍රමයක් මම වරක් සොයා ගතිමි . මට හරියටම උපක්‍රමය මතක නම් මම මෙහි පළ කරමි.
ටවර්

3
Age මාගීක් මකා දැමිය හැකි එවාල්-ප්‍රකාශිත විචල්‍යයන් ගැන ඔහු සිතමින් සිටී. මම මේ ගැන වරක් බ්ලොග් සටහනක් ලිව්වා .
kangax

1
මාතෘකාවෙන් ටිකක් එහා ගිය නමුත් එය යොමු කිරීම සඳහා මෙහි සඳහන් කිරීම. "ඉඩ" යනු "var" ට බෙහෙවින් සමාන වන අතර මොසිල්ලා හි සහය දක්වයි. ප්‍රධාන වෙනස නම්, විචල්‍ය විචල්‍යයක විෂය පථය සමස්ත සංවෘත ශ්‍රිතය වන අතර එහිදී “ඉඩ දෙන්න” එහි වාරණයට සීමා වේ
මැක්

ඇලෙක්ස්ගේ උදාහරණවල අවසාන පේළි දෙක මිශ්‍ර වූයේ නම්: var someObject = {}සහ someObject.someProperty = 5? ඇත somePropertyඑය දේශීය දේහය පිළිබඳ දේපල වන අතර වස්තුව, ගෝලීය බවට?
snapfractalpop

1
@Kangax ආමන්ත්රණය දේ සඳහා පිරිවිතර නම DontDelete කොඩිය මානකල (= false) , ඔබ සම්බන්ධයෙන් මේ ගැන කියවන්න පුළුවන් Object.definePropertyසහObject.getOwnPropertyDescriptor
පෝල් එස්

137

එය " දේශීය සහ ගෝලීය " අතර වෙනස යැයි පැවසීම සම්පූර්ණයෙන්ම නිවැරදි නොවේ.

එය " දේශීය සහ ළඟම " අතර වෙනස ලෙස සිතීම වඩා හොඳ විය හැකිය . ආසන්නතම දේ නිසැකවම ගෝලීය විය හැකි නමුත් එය සැමවිටම එසේ නොවේ.

/* global scope */
var local = true;
var global = true;

function outer() {
    /* local scope */
    var local = true;
    var global = false;

    /* nearest scope = outer */
    local = !global;

    function inner() {
        /* nearest scope = outer */
        local = false;
        global = false;

        /* nearest scope = undefined */
        /* defaults to defining a global */
        public = global;
    }
}

3
outerඔබ නිර්වචනය කරන ආසන්නතම විෂය පථය var global = false;නොවේද?
ස්නෙක්ස්

Ne ස්නෙක්ස්: <code> var global = false; </ code> ප්‍රකාශයට පත් කළ විට 'ළඟම' අදාළ නොවේ. එම ප්‍රකාශයේ 'ගෝලීය' පිටත () විෂය පථයට ඇතුළත් කර ඇති බැවින් ප්‍රකාශයේ 'var' භාවිතා වේ. 'Var' අභ්‍යන්තර () හි භාවිතා නොවන නිසා, එය ඊළඟ මට්ටමේ අගය වෙනස් කරයි, එය පිටත () වේ.
මිච්

ඔබ එම රේඛාව වෙනස් කළහොත් ඔබ අදහස් දැක්වීම වෙනස් වේ දැයි මට සිතේ var global = local;. එය අමුතු දෙයක් වුවද, ඔබ එම රේඛාවම වෙනස් කරන්නේ නම්, var global = globalඑහි වටිනාකම සෙවීමේදී ළඟම ඇති විෂය පථය globalගෝලීය කවුළු විෂය පථයට වඩා ඉහළ මට්ටමක පවතී.
ස්නෙක්ස්

80

ජාවාස්ක්‍රිප්ට් බ්‍රව්සරයක ක්‍රියාත්මක වන විට, ඔබගේ සියලු කේතයන් ප්‍රකාශයක් සහිතව වට කර ඇත:

with (window) {
    //Your code
}

වැඩි විස්තර with - එම්ඩීඑන්

වත්මන් විෂය පථයේvar විචල්‍යයක් ප්‍රකාශ කරන බැවින් , කවුළුව ඇතුළත ප්‍රකාශ කිරීම අතර වෙනසක් නැතvar සහ එය කිසිසේත් ප්‍රකාශ නොකිරීම .

වෙනස පැමිණෙන්නේ ඔබ කෙලින්ම කවුළුව තුළ නොසිටින විටය, උදා: ශ්‍රිතයක් තුළ හෝ බ්ලොක් එකක් තුළ.

භාවිතා කිරීම var ඔබට එකම නමක් ඇති බාහිර විචල්‍යයන් සැඟවීමට ඉඩ දේ. මේ ආකාරයෙන් ඔබට "පුද්ගලික" විචල්‍යයක් අනුකරණය කළ හැකිය, නමුත් එය තවත් මාතෘකාවකි.

නියමාකාර නීතියක් වන්නේ සෑම විටම භාවිතා කිරීමයි var , එසේ නොමැතිනම් ඔබ සියුම් දෝෂ හඳුන්වා දීමේ අවදානම බැවිනි.

සංස්කරණය කරන්න: මට ලැබුණු විවේචන වලින් පසුව, මම පහත සඳහන් කරුණු අවධාරණය කිරීමට කැමැත්තෙමි.

  • var විචල්යයක් ප්රකාශ කරයි වත්මන් විෂය පථයේ
  • ගෝලීය විෂය පථය window
  • varව්‍යංග ප්‍රකාශ භාවිතා නොකිරීමvarගෝලීය විෂය පථයේ (කවුළුව)
  • භාවිතා කරමින් ගෝලීය විෂය පථයේ (කවුළුව) විචල්‍යයක් ප්‍රකාශ කිරීම var එය මඟ හැරීම හා සමාන වේ.
  • කවුළු භාවිතයෙන් වෙනස් පරාසයන්හි විචල්‍යයක් ප්‍රකාශ කිරීම var එකම දෙය නොවේ විචල්‍යයක් ප්‍රකාශ කිරීම විචල්‍යයක් නොමැතිව ප්‍රකාශ කිරීමvar
  • varඑය හොඳ පුරුද්දක් බැවින් සෑම විටම පැහැදිලිව ප්‍රකාශ කරන්න

1
මම ඔබව පහත් කොට සැලකුවේ නැත, නමුත් විෂය පථය කවුළුවට වඩා හොඳ වචනයක් විය හැකිය. ඔබ සම්පූර්ණ පැහැදිලි කිරීම ටිකක් තරබාරුයි.
රොබට් හාවි

4
මම සරලවම එහි නම සමඟ දේවල් අමතන්නෙමි, ඔබට එය "ගෝලීය විෂය පථය" ලෙස හැඳින්වීමට අවශ්‍යයි, එය හරි, නමුත් සේවාදායකයාගේ පැත්තෙන්, සම්මුතිය අනුව, කවුළු වස්තුව, එය විෂය පථයේ අවසාන අංගය වන අතර, ඔබට සෑම දෙයක්ම ඇමතිය හැක්කේ ඇයි? "කවුළුව" ලිවීමකින් තොරව කවුළුව තුළ ඇති සෑම වස්තුවක්ම.
kentaromiura

2
+1 මෙය ඇත්තෙන්ම හොඳ පැහැදිලි කිරීමකි - මීට පෙර මේ හා සමාන var / no var ගැටලුවක් මා අසා නැත.
doug

මෙම පිළිතුර letබොහෝමයක් ES6 සමඟ ප්‍රතික්ෂේප කර ඇත.
ඉවාන් කැරොල්

3
@EvanCarroll මේ පිළිතුර, var සැර බාල ඕනෑම විචල්ය ප්රකාශ නොවන බැවිනි ද තාක්ෂණික වැරදිය ඒ වෙනුවට ඔහු කෙළේ, එය ගෝලීය වස්තුව මත deletable දේපල නිර්මාණය, ES5 "භාවිතා තදබල" මාදිලිය සමග හැර බොහෝ පිළිතුර පැහැදිලිවම නිවැරදි නොවේ, ද wasn ඉඩ ' මෙම පිළිතුරේ දී පවා සලකා බැලූ විට, ජාවාස්ක්‍රිප්ට් අනුවාදය (ඊයේ එකතු කරන ලදි) ගැන කිසිදු සඳහනක් නොතිබූ බැවින් එයින් ගම්‍ය වන්නේ (එවකට) යොමු ප්‍රමිතිය ECMA 262 3 වන සංස්කරණය බවයි.
kentaromiura

43

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

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


17
“හොඳ කේතීකරණ පුහුණුව” කිසි විටෙකත් ප්‍රමාණවත් හේතුවක් නොවිය යුතුය. එය "අන්තර්ජාලයේ සිටින සමහර පිරිමි ළමයින් පැවසුවේ මගේ කේතය පෙනිය යුතු ආකාරය මෙයයි" යන්නයි. එය "මගේ ගුරුවරයා කීවාට වඩා" වලංගු වේ, යමෙකු අවම වශයෙන් නොපැහැදිලි ලෙස නීතිය තේරුම් ගැනීමට හේතුව තේරුම් නොගන්නේ නම්.
cHao

මම හිතනවා good coding practice එය නිර්දේශිත හොඳම භාවිතයක් නම් මෙය සැමවිටම ප්‍රමාණවත් හේතුවක් වන අතර මෙය ජාවාස්ක්‍රිප්ට් කතුවරුන් කිහිප දෙනෙකුගේ ය.
ක්‍රිස් එස්

8
H ක්‍රිස්: නැත, “හොඳ කේතීකරණ පුහුණුව” එයම හේතුවක් නොවේ. මෙම හේතුව එය හොඳ පුහුණුවක් සලකා වෙනවා වැදගත් වන්නේ. ඔවුන් එය නිර්දේශ කරන්නේ මන්දැයි එම කතුවරුන් ඔබට නොකියන්නේ නම්, ඔවුන්ගේ නිර්දේශය කිසිදු බරක් නොගත යුතුය. ඔබ හේතු සමඟ එකඟ නොවන්නේ නම්, එය නරක උපදෙස් ලෙස සලකා බැලීමට ඔබට නිදහස තිබේ. ඒ මන්දැයි ඔබ කිසි විටෙකත් විමසන්නේ නැතිව එය අනුගමනය කරන්නේ නම්, භාණ්ඩ සංස්කෘතිය ආරම්භ වන්නේ එලෙසිනි.
cHao

30

දේශීය විචල්‍යයන් ප්‍රකාශ නොකිරීමෙන් ඔබට හසු විය හැකි ආකාරය පිළිබඳ හොඳ උදාහරණයක් මෙන්න var:

<script>
one();

function one()
{
    for (i = 0;i < 10;i++)
    {
        two();
        alert(i);
    }
}

function two()
{
    i = 1;
}
</script>

( iලූපයේ සෑම ක්‍රියාකාරකමකදීම නැවත සකසනු ලැබේ, එය දේශීයව forලූපයේ ප්‍රකාශයට පත් කර නැති නමුත් ගෝලීයව)


අහෝ! මට හිතාගන්න පුළුවන් ඒ යතුරු ලියනය නිසා ඇතිවිය හැකි සියලු දෝෂ.
බොන්සායි ඕක්

2
මට කුතුහලයක් ඇත, ඇයි ඔබ මා () ට තර්කයක් ලෙස ඉදිරිපත් කරන්නේ? (for for loop) එය අතිරික්තද?
kalin

පරාමිතියකින් තොරව දෙක () ශ්‍රිතය අර්ථ දක්වා ඇති හෙයින්, එක් () ශ්‍රිතයක් තුළ සංයුක්ත කර ඇති () ශ්‍රිත දෙකක තර්කය නොසලකා හරිනු ලැබේ. ඔබ තරමක් නිවැරදියි, එය භූමිකාවක් නොවන බැවින් එය අවශ්‍ය නොවේ.
කේ.කේ.

දෝෂයක් හෝ අංගයක්?
TheMaster

13

මම කියන්නේ එය භාවිතා කිරීම වඩා හොඳ බවයි varබොහෝ අවස්ථාවන්හිදී .

දේශීය විචල්‍යයන් සැමවිටම ගෝලීය විෂය පථයේ විචල්‍යයන්ට වඩා වේගවත් වේ.

ඔබ භාවිතා නොකරන්නේ නම් var විචල්‍යයක් ප්‍රකාශ කිරීමට , විචල්‍යය ගෝලීය විෂය පථයට අයත් වේ.

වැඩි විස්තර සඳහා, ඔබට ගූගල් හි "විෂය පථ දාම ජාවාස්ක්‍රිප්ට්" සෙවිය හැකිය.


ඔබ var keyword භාවිතා කරමින් විචල්‍යයක් ප්‍රකාශ කරන්නේ නම්, එය ධාවන වේලාවේදී නිර්මාණය වනු ඇත, එබැවින් එය මන්දගාමී නොවිය යුතුද? මන්ද යත්, අනෙක් ඒවා විග්‍රහ කරන වේලාවට නිර්මාණය වී ඇති බැවිනි.
Barış Velioğlu

YRyuKaplan - ඒයි, ඒක ඇත්තද? මම ගොග්ලිං කිරීමට උත්සාහ කළ අතර මෙම විෂය පිළිබඳ කිසිදු තොරතුරක් ලබා ගැනීමට නොහැකි විය! එම ප්‍රකාශය සඳහා ඔබට ප්‍රභව අධිකාරියක් තිබේද? Thx
mike rodent

YRyuKaplan විග්‍රහ කිරීම / සම්පාදනය කිරීම ඇත්ත වශයෙන්ම කේතය ධාවනය කිරීමට වඩා වෙනස් වේ.
gcampbell

11

භාවිතා නොකරන්න var!

varයනු විචල්‍යයක් ප්‍රකාශ කිරීමට පෙර ES6 ක්‍රමයයි. අපි දැන් අනාගතයේ සිටින අතර ඔබ කේතනය කළ යුත්තේ එවැනි ය.

භාවිතා කරන්න constසහlet

const95% ක් සඳහා භාවිතා කළ යුතුය. එමඟින් එය විචල්‍ය යොමුව වෙනස් කළ නොහැකි බැවින් අරාව, වස්තුව සහ DOM නෝඩ් ගුණාංග වෙනස් විය හැකි අතර එය එසේ විය යුතුය const.

letනැවත පැවරීමට අපේක්ෂා කරන ඕනෑම විචල්‍යයක් සඳහා භාවිතා කළ යුතුය. මෙය සඳහා ලූපයක් තුළ ඇතුළත් වේ. ආරම්භයෙන් varName =ඔබ්බට ඔබ කවදා හෝ ලියන්නේ නම් , භාවිතා කරන්නlet .

අනෙක් බොහෝ භාෂාවලින් අපේක්ෂා කළ පරිදි දෙකම බ්ලොක් මට්ටමේ විෂය පථයන් ඇත.


2
ඔබ 'var' සියල්ල 'const' මගින් ප්‍රතිස්ථාපනය කරන්න (සියල්ල ප්‍රතිස්ථාපනය කරන්න). ඔබ නැවත පවරා ඇති විචල්‍යයන් කොහේදැයි ඔබ ඉක්මනින් දකිනු ඇත. ඔබ සතුව ඒවායින් වැඩි ප්‍රමාණයක් තිබේ නම්, ඔබ බොහෝ විට රටා විරෝධී ලෙස කේත කරයි: නැවත පැවරිය හැකි බොහෝ විචල්‍යයන් වසා දැමීම් හෝ වස්තු-ගුණාංග ලෙස කාවැද්දිය හැකිය. ඔබට කිහිපයක් තිබේ නම්: ඔවුන් සඳහා 'ඉඩ දෙන්න' භාවිතා කරන්න. අවසාන වශයෙන්, සමහර විචල්‍යයන් 'var' සමඟ කිසිසේත් ප්‍රමාද නොවන්නේ නම්, ඒවා ප්‍රකාශයට පත් නොවී පවතිනු ඇති අතර ගෝලීය අවකාශයේ තවමත් පවතී නම් පරෙස්සම් වන්න. Ib ගිබෝල්ට් අදහස් දැක්වීම සඳහා 'ඇතුළත ලූපයක්' ගැන, "95% ක්ම" තුළ එවැනි ලූප වළක්වා ගැනීම රෙකමදාරු කරනු ලැබේ ;-): අරාව ක්‍රම විශිෂ්ටයි.
allez l'OM

95% ක්ම කොන්ස්ට් භාවිතා කළ යුතු යැයි පැවසීමෙන්, අප හොඳ පුරුද්දෙන් හා ප්‍රවාදයට යන බවක් පෙනේ.
අගමෙම්නස්

9

තවත් වෙනසක් උදා

var a = a || [] ; // works 

අතර

a = a || [] ; // a is undefined error.

1
'Var' සමඟ විචල්යය අර්ථ දක්වා ඇති අතර විචල්ය var සමඟ අර්ථ දක්වා නොමැති විට එය ක්රියා කරන්නේ මන්දැයි ඔබට පැහැදිලි කළ හැකිද? පැවරුමේ දකුණු පැත්ත තක්සේරු කිරීමට පෙර විචල්‍යය නිර්මාණය වී varතිබේද?
matt

6
Use ලුසෙක් var aවිෂය පථයේ ඉහළට ඔසවා විචල්‍යය ප්‍රකාශයට පත් කරන නමුත් ආරම්භ නොකරන ශුන්‍යයට සකසා ඇති හෙයින් , පැවරුමේදී ඔබට නිර්වචනය නොකළ ශුන්‍ය විචල්‍යයක් ගැන සඳහනක් ඇති අතර එය අසත්‍ය ලෙස තක්සේරු කර පැවරුම සකසන්න []. අග දී, ඔබ දේපල කිරීමට පැවරුමක් ඇති aදේපල a. ඔබට නොපවතින දේපලකට පැවරිය හැකිය - එය පැවරුම මත නිර්මාණය කිරීම, නමුත් ඔබට ReferenceErrorවිසි කිරීමකින් තොරව නොපවතින දේපලකින් ඔබට කියවිය නොහැක .
ඉවාන් කැරොල්

1
An ඉවාන් කැරොල්: එය විෂය පථයට ඉහළට ඔසවා ශුන්‍ය වෙනුවට නිර්වචනය නොකෙරේ.
mithunsatheesh

8

varගෝලීය විෂය පථය හා විචල්‍යයන් එකිනෙකා සමඟ ගැටීමෙන් වලක්වා ගැනීම සඳහා අනවශ්‍ය ලෙස නැවත ලිවීමට හේතු වන විචල්‍යයන් වැළැක්වීම සඳහා භාවිතා කිරීම සැමවිටම හොඳ අදහසකි.


8

නොමැතිව var- ගෝලීය විචල්‍යය.

දේශීය සන්දර්භය තුළ ආරම්භක ගෝලීය විචල්‍යය - නපුරු බැවින් සෑම විටමvar ප්‍රකාශය භාවිතා කිරීමට දැඩි ලෙස නිර්දේශ කෙරේ . එහෙත්, ඔබට මෙම අපිරිසිදු උපක්‍රමය අවශ්‍ය නම්, පිටුව ආරම්භයේදීම අදහස් දැක්විය යුතුය:

/* global: varname1, varname2... */

3

මෙම සංකල්පය ඔබට අවබෝධ කර ගැනීම සඳහා මා විසින් ලියන ලද උදාහරණ කේතය මෙයයි:

var foo = 5; 
bar = 2;     
fooba = 3;

// Execute an anonymous function
(function() {    
    bar = 100;             //overwrites global scope bar
    var foo = 4;           //a new foo variable is created in this' function's scope
    var fooba = 900;       //same as above
    document.write(foo);   //prints 4
    document.write(bar);   //prints 100
    document.write(fooba); //prints 900
})();

document.write('<br/>');
document.write('<br/>');
document.write(foo);       //prints 5
document.write(bar);       //prints 100
document.write(fooba);     //prints 3

2
ශ්‍රිතය කිසිසේත් “නිර්නාමික” නොවේ. ඇත්ත වශයෙන්ම, එය විය හැකි තරම් දෘශ්‍යමාන ලෙස නම් කර ඇත.
ඉන්ගෝ බර්ක්

"නිර්නාමික ශ්‍රිතය" සැබවින්ම නිර්නාමික බවට පත් කිරීම සඳහා ඉන්ගෝ බර්ක්ගේ ප්‍රකාශයට ප්‍රතිචාර වශයෙන් ඔබේ පිළිතුර සංස්කරණය කිරීමට ස්තූතියි.
ඩේව් බර්ටන්

3

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

පහත දැක්වෙන ස්නිපෙට් ප්‍රතිදානයන් ඔබ අපේක්ෂා කරන පරිදි ["text"]:

function var_fun() {
  let array = []
  array.push('text')
  return array
}

console.log(var_fun())

පහත දැක්වෙන ස්නිපටයද එසේමය ( letපෙර නැතිවූ දේ සටහන් කරන්න array):

function var_fun() {
  array = []
  array.push('text')
  return array
}

console.log(var_fun())

දත්ත හැසිරවීම අසමමුහුර්තව ක්‍රියාත්මක කිරීම තවමත් එකම ප්‍රති result ලය තනි ක්‍රියාකරුවෙකු සමඟ ලබා දෙයි:

function var_fun() {
  array = [];
  return new Promise(resolve => resolve()).then(() => {
    array.push('text')
    return array
  })
}

var_fun().then(result => {console.log(result)})

නමුත් බහු අය සමඟ වෙනස් ලෙස හැසිරේ:

function var_fun() {
  array = [];
  return new Promise(resolve => resolve()).then(() => {
    array.push('text')
    return array
  })
}

[1,2,3].forEach(i => {
  var_fun().then(result => {console.log(result)})
})

කෙසේ වෙතත් ඉඩ භාවිතා කිරීම:

function var_fun() {
  let array = [];
  return new Promise(resolve => resolve()).then(() => {
    array.push('text')
    return array
  })
}

[1,2,3].forEach(i => {
  var_fun().then(result => {console.log(result)})
})


උදාහරණයට ස්තූතියි isthisismydesign! අවසාන උදාහරණ දෙක සම්බන්ධයෙන් ගත් කල, අවසාන උදාහරණය මූලද්‍රව්‍ය 3 කින් පෙළක් තුන් වතාවක් පෙළ ලියා ඇති අතර අවසාන උදාහරණය අරාව තුළ ඇති එක් මූලද්‍රව්‍යයකට එක් වරක් පමණක් “පෙළ” ලොග් කරයි. . ප්‍රතිදානය? ForEach "i" ශ්‍රිතය සහ සියලු ගෝලීය විචල්‍යයන් මත නැවත ක්‍රියාත්මක වන නිසාද?
AlmostPitt

2

කවුරුහරි මෙය ඉගෙන ගැනීමට උත්සාහ කරන විට මම එය දකිමි. ඉහත උදාහරණ ආරම්භකයකුට තරමක් අධික ලෙස සංකීර්ණ විය හැකිය.

ඔබ මෙම කේතය ධාවනය කරන්නේ නම්:

var local = true;
var global = true;


function test(){
  var local = false;
  var global = false;
  console.log(local)
  console.log(global)
}

test();

console.log(local);
console.log(global);

ප්‍රතිදානය මෙසේ කියවනු ඇත: අසත්‍ය, අසත්‍ය, සත්‍ය, සත්‍ය

ශ්‍රිතයේ විචල්‍යයන් එය පිටතින් ඇති අයගෙන් වෙන් වෙන්ව දකින බැවින් දේශීය විචල්‍යය යන පදය සහ එයට හේතුව අප පැවරුමේ var භාවිතා කළ බැවිනි. ඔබ ශ්‍රිතයේ var ඉවත් කළහොත් එය දැන් මෙසේ කියවේ:

var local = true;
var global = true;


function test(){
  local = false;
  global = false;
  console.log(local)
  console.log(global)
}

test();

console.log(local);
console.log(global);

ප්‍රතිදානය අසත්‍ය, අසත්‍ය, අසත්‍ය, අසත්‍ය ය

මෙයට හේතුව දේශීය විෂය පථයේ හෝ ශ්‍රිතයේ නව විචල්‍යයක් නිර්මාණය කරනවාට වඩා එය ගෝලීය විචල්‍යයන් භාවිතා කර ඒවා අසත්‍යයට නැවත පැවරීමයි.


2

Var සමඟ හෝ රහිතව සහ ශ්‍රිතය ඇතුළත හෝ පිටත විචල්‍යයන් ප්‍රකාශ කිරීමේදී මිනිසුන් ව්‍යාකූල වී ඇති බව මට පෙනේ . මෙම පියවරයන් හරහා ඔබව ගෙන යන ගැඹුරු උදාහරණයක් මෙන්න:

පහත දැක්වෙන පිටපත jsfiddle හි ක්‍රියාත්මක වන්න

a = 1;// Defined outside the function without var
var b = 1;// Defined outside the function with var
alert("Starting outside of all functions... \n \n a, b defined but c, d not defined yet: \n a:" + a + "\n b:" + b + "\n \n (If I try to show the value of the undefined c or d, console.log would throw 'Uncaught ReferenceError: c is not defined' error and script would stop running!)");

function testVar1(){
    c = 1;// Defined inside the function without var
    var d = 1;// Defined inside the function with var
    alert("Now inside the 1. function: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n d:" + d);

    a = a + 5;
    b = b + 5;
    c = c + 5;
    d = d + 5;

    alert("After added values inside the 1. function: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n d:" + d);
};


testVar1();
alert("Run the 1. function again...");
testVar1();

function testVar2(){
    var d = 1;// Defined inside the function with var
    alert("Now inside the 2. function: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n d:" + d);

    a = a + 5;
    b = b + 5;
    c = c + 5;
    d = d + 5;

    alert("After added values inside the 2. function: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n d:" + d);
};

testVar2();

alert("Now outside of all functions... \n \n Final Values: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n You will not be able to see d here because then the value is requested, console.log would throw error 'Uncaught ReferenceError: d is not defined' and script would stop. \n ");
alert("**************\n Conclusion \n ************** \n \n 1. No matter declared with or without var (like a, b) if they get their value outside the function, they will preserve their value and also any other values that are added inside various functions through the script are preserved.\n 2. If the variable is declared without var inside a function (like c), it will act like the previous rule, it will preserve its value across all functions from now on. Either it got its first value in function testVar1() it still preserves the value and get additional value in function testVar2() \n 3. If the variable is declared with var inside a function only (like d in testVar1 or testVar2) it will will be undefined whenever the function ends. So it will be temporary variable in a function.");
alert("Now check console.log for the error when value d is requested next:");
alert(d);

නිගමනය

  1. (A, b වැනි) var සමඟ හෝ රහිතව ප්‍රකාශයට පත් කළද, ඒවායේ අගය ශ්‍රිතයෙන් පිටත ලැබෙන්නේ නම්, ඒවා ඒවායේ වටිනාකම ආරක්ෂා කරනු ඇති අතර, ස්ක්‍රිප්ට් හරහා විවිධ ශ්‍රිතයන් තුළ එකතු වන වෙනත් අගයන් ආරක්ෂා වේ.
  2. ශ්‍රිතයක් තුළ (c වැනි) විචල්‍යතාවයකින් තොරව විචල්‍යය ප්‍රකාශයට පත් කළ හොත්, එය පෙර නියමය මෙන් ක්‍රියා කරයි, එය මෙතැන් සිට සියලු ශ්‍රිත හරහා එහි අගය ආරක්ෂා කරයි. එක්කෝ එය ටෙස්ට්වර් 1 () හි පළමු අගය ලබා ගත් අතර එය තවමත් අගය ආරක්ෂා කර ඇති අතර ටෙස්ට්වර් 2 ()
  3. විචල්‍යය ශ්‍රිතයක් තුළ පමණක් var සමඟ ප්‍රකාශයට පත් කළ හොත් (testVar1 හෝ testVar2 හි d වැනි) ශ්‍රිතය අවසන් වන සෑම විටම එය නිර්වචනය නොකෙරේ. එබැවින් එය ශ්‍රිතයක තාවකාලික විචල්‍යය වනු ඇත.

මෙම මාතෘකාව නිරූපණය කිරීම සඳහා ආදර්ශයක් නිර්මාණය කිරීමට කාලය ගැනීම ගැන ස්තූතියි. ඉහත කේතය පහත කොටස අස්ථානගත වී ඇති බැවින් ඔබට ඔබේ පිළිතුර සංස්කරණය කිරීමට අවශ්‍ය වනු ඇත: a = 1; // ශ්‍රිතයෙන් පිටත අර්ථ දැක්වෙන්නේ var var b = 1; // ශ්‍රිතයෙන් පිටත අර්ථ දක්වා ඇත්තේ var alert ("සියලු ක්‍රියාකාරකම් වලින් පිටත සිට ආරම්භ කිරීම ... \ n \ na, b නිර්වචනය කර ඇති නමුත් c, d තවම අර්ථ දක්වා නැත: \ na: "+ a +" b nb: "+ b +" \ n \ n (මම නිර්වචනය නොකළ c හි අගය පෙන්වීමට උත්සාහ කළහොත් හෝ d, console.log විසින් 'නොකැඩූ යොමු යොමු දෝෂය: c යන්න අර්ථ දක්වා නැත' දෝෂය සහ ස්ක්‍රිප්ට් ධාවනය නතර වනු ඇත!) ");
සංකෝෆා

1

කේතයක් ඇතුළත ඔබ var භාවිතා නොකර විචල්‍යයක් භාවිතා කරන්නේ නම්, සිදුවන්නේ ස්වයංක්‍රීයව var var_name ගෝලීය විෂය පථයට ඇතුළත් කිරීමයි.

someFunction() {
    var a = some_value; /*a has local scope and it cannot be accessed when this
    function is not active*/
    b = a; /*here it places "var b" at top of script i.e. gives b global scope or
    uses already defined global variable b */
}

1

විෂය පථයට අමතරව, සමහර පුද්ගලයින් එසවීම ගැන සඳහන් කළද කිසිවෙකු උදාහරණයක් දුන්නේ නැත. ගෝලීය විෂය පථය සඳහා මෙන්න:

console.log(noErrorCase);
var noErrorCase = "you will reach that point";

console.log(runTimeError);
runTimeError = "you won't reach that point";


0

"Var" විචල්‍යයන් භාවිතා නොකර අර්ථ දැක්විය හැක්කේ අගයක් සැකසූ විට පමණි. උදාහරණයක් ලෙස:

my_var;

ගෝලීය විෂය පථයේ හෝ වෙනත් විෂය පථයක වැඩ කළ නොහැක . එය පහත සඳහන් අගය සමඟ විය යුතුය:

my_var = "value";

අනෙක් අතට ඔබට වැනි ශක්‍යතාවයක් අර්ථ දැක්විය හැකිය;

var my_var;

එහි වටිනාකම undefined(එහි වටිනාකම එසේ නොවන nullඅතර එය nullසිත්ගන්නා සුළු ලෙස සමාන නොවේ .).


my_var;ඇත්ත වශයෙන්ම වලංගු ප්‍රකාශන ප්‍රකාශයකි.
ශබ්දකෝෂය

පෙර විචල්‍යය අර්ථ දක්වා ඇත්නම් එය වලංගු ප්‍රකාශයකි. එසේ නොමැතිනම් එය දෝෂයක් විසි කරයි "... අර්ථ දක්වා නැත".
umut

3
පෙර විචල්‍යයක් නිර්වචනය කර තිබේද නැද්ද යන්න නොසලකා එය වලංගු ප්‍රකාශයකි . :) වලංගු ප්‍රකාශයක් මඟින් එම ප්‍රකාශය අවලංගු නොකරන දෝෂයක් විසි කළ හැකිය .
ශබ්දකෝෂය

මම ඒ ගැන ව්‍යාකූල වී සිටිමි. වලංගු ප්‍රකාශය යනු කුමක්ද? ඔබට මට අවලංගු ප්‍රකාශයක් ලබා දිය හැකිද?
umut

මට සමාව ඉල්ලීමට සිදුවේ - මෑතකදී ECMAScript ව්‍යාකරණ ඕනෑවට වඩා. my_var;වලංගු ප්‍රකාශන ප්‍රකාශයකි . /my_var;අවලංගු ප්‍රකාශයක් වනු ඇත. නමුත් මා පැවසූ පරිදි, මෙය ව්‍යාකරණ කැෂුවිස්ටික්, මම සමාව ඉල්ලමි, මගේ ප්‍රකාශය ඇත්ත වශයෙන්ම සුදුසු නොවේ.
ශබ්දකෝෂ

0

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

Var keyword භාවිතා නොකර විචල්‍යයන් නිර්වචනය කළ විට, එය පෙනෙන්නේ සරල “පැවරුම්” මෙහෙයුමකි.

ජාවාස්ක්‍රිප්ට් හි විචල්‍යයකට අගය පවරා ඇති විට, පරිවර්තකයා ප්‍රථමයෙන් “විචල්‍ය ප්‍රකාශනය” සොයා ගැනීමට උත්සාහ කරන්නේ පැවරුමේ සන්දර්භය තුළ / විෂය පථය තුළ ය. පරිවර්තකය ක්‍රියාත්මක වන විට dummyVariable = 20, එය ශ්‍රිතයේ ආරම්භයේ දී ව්‍යාජ විචල්‍යතාව ප්‍රකාශ කිරීම සඳහා සොයා බලයි. (සියලු විචල්‍ය ප්‍රකාශයන් ජාවාස්ක්‍රිප්ට් පරිවර්ථකයා විසින් සන්දර්භයේ ආරම්භයට ගෙන යන බැවින් මෙය එසවීම ලෙස හැඳින්වේ)

ඔබට ජාවාස්ක්‍රිප්ට් වල එසවීම දෙස බැලීමට අවශ්‍ය විය හැකිය

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.