var kalit so'zining maqsadi nima va uni qachon ishlatishim kerak (yoki uni o'tkazib yuborishim kerak)?

DIQQAT: Bu savol ECMAScript-ning 3 yoki 5-versiyasi nuqtai nazaridan berilgan. ECMAScript 6 versiyasida yangi funksiyalar kiritilgandan keyin javoblar eskirib qolishi mumkin.

JavaScript-da var kalit so'zining aniq vazifasi nima va ular orasidagi farq nima

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

va

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

?

Ulardan birini qachon ishlatasiz va u nima uchun/nima qiladi?


person Alex    schedule 24.09.2009    source manba
comment
Var deklaratsiyasini zanjirlashda verguldan keyin yangi qator qo'yish xatti-harakatlarga ta'sir qiladimi? var x=1, y=2, [qaytish]z=3;   -  person Alfabravo    schedule 20.11.2011
comment
Agar siz tanlagan o'zgaruvchi nomi oldindan belgilangan global o'zgaruvchi bo'lib qolsa, var dan foydalanilmasa, sizni ochiq qoldiradi. Mening qayg‘u sayohatimni bu yerda ko‘ring: stackoverflow.com/questions/16704014/   -  person Scott C Wilson    schedule 23.05.2013
comment
@Ray Toalning meloncard blog posti (albatta o'qishga arziydi) blog.safeshepherd.com/23/how-one-missing-var-ruined-our-launch   -  person Hephaestus    schedule 02.03.2014
comment
Men hech qachon she'r meni dasturiy muammoni ko'rib chiqishga undashi mumkinligini tasavvur qilmagan edim   -  person Félix Adriyel Gagnon-Grenier    schedule 15.03.2015
comment
Buning o'rniga const va let foydalaning! var zamonaviy JS emas   -  person Gibolt    schedule 15.08.2017
comment
@Gibolt, lekin savol sanasiga qarang, buni aytish uchun 2009 yilgi savol nohaq chaqirish. Garchi u texnik xizmat ko'rsatish uchun hozirgi kundagidek amalda bo'lsa ham, zamonaviy bo'lmagan JS kodlari to'plami mavjud.   -  person Andre Figueiredo    schedule 16.03.2018
comment
Umid qilamanki, mening sharhimni o'qiyotgan, JS uchun yangi bo'lgan (ehtimol, buni qidirayotgan bo'lsa) erta o'rganadi. Zamonaviy bo'lmagan kod mavjudligi sababli, biz uni to'g'ri javob sifatida davom ettirishimiz kerak degani emas   -  person Gibolt    schedule 16.03.2018


Javoblar (19)


Agar siz global miqyosda bo'lsangiz, unda unchalik katta farq yo'q. Tushuntirish uchun Kangax javobini o'qing.

Agar siz funktsiyada bo'lsangiz, var mahalliy o'zgaruvchini yaratadi, "no var" o'zgaruvchini topmaguncha yoki global qamrovga tegmaguncha (o'sha paytda u uni yaratadi) qamrov zanjirini qidiradi. ):

// 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
    }())
}

Agar siz topshiriqni bajarmasangiz, var dan foydalanishingiz kerak:

var x; // Declare x
person Greg    schedule 24.09.2009
comment
Haqiqatan ham katta farq yo'qmi == Farqi yo'qmi? - person Alex; 24.09.2009
comment
Xo'sh, aslida ha, farq bor :) Bu farq muhimmi - boshqa savol. Javobimni quyida ko'ring: stackoverflow.com/questions/1470488/ da var ishlatish va var ishlatmaslik o'rtasidagi farq - person kangax; 25.09.2009
comment
Menimcha, bu Aleksning fikri bo'lishi mumkin, shuning uchun u buni is equal to operatoridan foydalangan holda yozgan! - person James Bedford; 13.09.2012
comment
Bu xuddi o‘z-o‘zini relsli quroldan otganga o‘xshaydi... O‘zgaruvchining oldiga “var” qo‘yishni unuting va oxir-oqibat qamrov zanjiridagi qaerdadir o‘zgaruvchini o‘zgartiring... Java/C/Pythonni ishontirishga harakat qiling. /va boshqalar. JavaScript foydali ekanligini ishlab chiquvchi. Ha! C/C++ tuzoqlari aksincha yaxshi ko'rinadi. Tasavvur qiling-a, JavaScript-ni disk raskadrovka qilish kerak... Va ba'zi odamlar buni qilishadi, albatta. JavaScript-da yozilgan juda ko'p kod (va oddiy kod emas) bor ... - person Albus Dumbledore; 24.02.2013
comment
Agar siz global miqyosda bo'lsangiz, unda farq yo'q. ›› Quyidagi javobda tushuntirilgan farq bor. - person Max Koretskyi; 13.09.2013
comment
@Aleks 0 == noto'g'ri, shuning uchun ha, albatta, unchalik katta farq yo'q == Farqi yo'q, lekin juda katta farq yo'q!== Farqi yo'q - person Math chiller; 14.11.2013
comment
Agar qat'iy rejimda, hatto global miqyosda ham, uni e'lon qilish uchun sizga var kerak bo'ladi. - person Juan Mendes; 15.11.2013
comment
agar siz "qat'iy" dan foydalansangiz, var dan foydalanishingiz kerak. - person WarFox; 24.03.2014
comment
Agar siz modul naqshining umumiy api/shaxsiy a'zolari bilan saqlamoqchi bo'lsangiz, bu muhim. var ob'ektlarni modulning mahalliy doirasiga joylashtirishini tushunish juda muhimdir. tushuntirish uchun rahmat. Shuni ham ta'kidlash kerakki, agar men to'g'ri bo'lsam, x() funksiyasi var x = function() ga ekvivalent va x = function() dan qamrovni belgilash bo'yicha farqlanadi. - person ferr; 10.09.2014
comment
Sizga katta rahmat. Men bu bilan ko'p yillar davomida kurashib kelganman, keyin quyidagi qatorni o'qib chiqdim: "Agar siz funktsiyada bo'lsangiz, var mahalliy o'zgaruvchini yaratadi, hech bir var o'zgaruvchini topmaguncha yoki global qamrovga tegmaguncha qamrov zanjirini qidirmaydi ( qaysi nuqtada uni yaratadi)' - mukammal tushuntirish, rahmat. - person developerbmw; 04.02.2015
comment
Yopish yaratish deganda nimani tushunasiz? - person NuWin; 31.07.2016
comment
Bu katta farq: var bilan e'lon qilingan o'zgaruvchilar bajarish boshlanishidan oldin mavjud bo'ladi, mavjud bo'lmaganlari esa ularni yaratuvchi bayonot bajarilmaguncha mavjud emas. Shuningdek, var bilan e'lon qilinganlar o'chirilmaydi, bo'lmaganlari esa global ob'ektning o'chiriladigan xususiyatlari. Bundan tashqari, anonim funksiya nafaqat global o‘zgaruvchilarga (ya’ni, foo, bar va moo. - person RobG; 07.11.2017
comment
Shuningdek qarang: stackoverflow.com/questions/38270470/ ikkita deklaratsiya o'rtasidagi yanada nozik farqning qiziqarli misoli uchun. - person Mihai Târnovan; 28.09.2018
comment
...qaysi nuqtada uni yaratadi iborasi juda noaniq iboraga ega - mening savolim haligacha hal qilinmagan. Bu nuqta mantiqiy oqim bilan bog'liqmi? (masalan, hech qayerda topilmagan, shuning uchun yaratilgan.. mahalliy) Yoki nuqta o'zgaruvchi yaratiladigan scopega bog'liqmi? (masalan, o'zgaruvchi global miqyosda qidirildi, hatto u erda ham topilmadi, shuning uchun u erda yaratilgan). Iltimos, uni biroz o'zgartira olasizmi? - person xakepp35; 21.10.2018
comment
C++ kodi uchun int i=1; { cout<<i; int i=2; cout<<i; } cout<<i; chiqishi quyidagicha bo'ladi: 121. Bu var- yoki var-kamroq xatti-harakatlarmi? - person xakepp35; 21.10.2018

Farq bor.

var x = 1 oʻzgaruvchini eʼlon qiladi x joriy koʻlamda (aka ijro konteksti). Agar deklaratsiya funktsiyada paydo bo'lsa - mahalliy o'zgaruvchi e'lon qilinadi; agar u global miqyosda bo'lsa - global o'zgaruvchi e'lon qilinadi.

x = 1, aksincha, faqat mulkiy topshiriqdir. U birinchi navbatda qamrov zanjiriga qarshi x ni hal qilishga harakat qiladi. Agar u ushbu tarmoq zanjirining istalgan joyidan topsa, u topshiriqni bajaradi; agar u x ni topmasa, u holda u global ob'ektda x xossasini yaratadi(bu qamrov zanjiridagi yuqori darajadagi ob'ekt).

Endi e'tibor bering, u global o'zgaruvchini e'lon qilmaydi, u global xususiyat yaratadi.

Ikkisi o'rtasidagi farq juda nozik va chalkash bo'lishi mumkin, agar sizo'zgaruvchan deklaratsiyalar ham xususiyatlar yaratishini (faqat o'zgaruvchan ob'ektda) va Javascriptdagi (yaxshi, ECMAScript) har bir xususiyatda tavsiflovchi ma'lum bayroqlarga ega ekanligini tushunmasangiz. ularning xususiyatlari - ReadOnly, DontEnum va DontDelete.

O'zgaruvchilar deklaratsiyasi DontDelete bayrog'i bilan xususiyat yaratganligi sababli, var x = 1 va x = 1 (global miqyosda bajarilganda) o'rtasidagi farq shundaki, birinchisi - o'zgaruvchilar deklaratsiyasi DontDelete'able xususiyatini yaratadi, ikkinchisi esa yaratmaydi. Natijada, ushbu yashirin topshiriq orqali yaratilgan xususiyat global ob'ektdan o'chirilishi mumkin va birinchisi - o'zgaruvchan deklaratsiya orqali yaratilgan - o'chirilmaydi.

Lekin bu, albatta, faqat nazariya vaamalda ikkalasi o'rtasida yanada ko'proq farqlar mavjuduni amalga oshirishdagi turli xatolar (masalan, IE dagilar) tufayli.

Umid qilamanki, hammasi mantiqiy :)


[Yangilanish 2010/12/16]

ES5 da (ECMAScript 5; yaqinda standartlashtirilgan, tilning 5-nashri) "qat'iy rejim" deb ataladigan - qo'shilgan til rejimi mavjud bo'lib, u e'lon qilinmagan topshiriqlarning xatti-harakatlarini biroz o'zgartiradi. Qattiq rejimda e'lon qilinmagan identifikatorga tayinlash ReferenceErrordir. Buning asosi tasodifiy topshiriqlarni qo'lga kiritish, istalmagan global xususiyatlarning paydo bo'lishiga to'sqinlik qilish edi. Ba'zi yangi brauzerlar allaqachon qattiq rejimni qo'llab-quvvatlashni boshladilar. Masalan, mening mos jadvalim ga qarang.

person kangax    schedule 24.09.2009
comment
Agar to'g'ri eslasam, men bir vaqtlar eval hack yordamida var-e'lon qilingan o'zgaruvchini delete qilishning yo'lini topdim deb o'ylayman. Agar aniq hiyla esimda bo'lsa, men bu erda yozaman. - person Tower; 30.06.2011
comment
@Mageek U o'chirilishi mumkin bo'lgan baholangan e'lon qilingan o'zgaruvchilarni olishi mumkin. Men bir marta blog postini yozganman. - person kangax; 20.06.2012
comment
Mavzudan bir oz tashqarida, lekin ma'lumot uchun bu erda eslatib o'tamiz. let varga juda o'xshaydi va Mozilla'da qo'llab-quvvatlanadi. Asosiy farq shundaki, o'zgaruvchining qamrovi butun qamrab oluvchi funktsiyadir, chunki let uning bloki bilan cheklangan. - person mac; 01.10.2012
comment
@kangax, agar Aleks misollarining oxirgi ikki qatori aralashgan bo'lsa-chi: var someObject = {} va someObject.someProperty = 5? someProperty global bo'ladimi, u mulk bo'lgan ob'ekt mahalliy bo'lib qoladimi? - person snapfractalpop; 28.11.2012
comment
@kangax DontDelete bayrog'i deb ataydigan xususiyatning nomi sozlanishi (= false), bu haqda Object.defineProperty va Object.getOwnPropertyDescriptor - person Paul S.; 08.01.2014
comment
ba'zi IE versiyalarida global miqyosda o'zgaruvchan deklaratsiyani o'chirishga imkon beruvchi xatolik mavjud - person Shiala; 19.12.2014
comment
@Shiala Men shunga o'xshash narsani eslayman. O'ylaymanki, faqat global o'rnatilgan o'zgaruvchilarni soya qiladigan (bir xil nomga ega) o'zgaruvchilar bilan, lekin ishonchim komil emas. - person kangax; 19.12.2014
comment
Men hozir kompyuter yonida emasman, lekin agar xotira menga to'g'ri xizmat qilsa, uni var x = 0 bilan sinab ko'rdim; va IE uni o'chirishga to'sqinlik qilmadi. - person Shiala; 19.12.2014
comment
Ushbu javobga qo'shimcha yangilanishni ko'rish yaxshi bo'lardi, unda OPs savoliga let omil qanday ta'sir ko'rsatishi haqida batafsil ma'lumot beradi. - person Snekse; 24.09.2015
comment
@Snekse let javobning x = 1 qismiga ta'sir qilmaydi, shuning uchun yagona farq var x = 1 va let x = 1 o'rtasida. Bu ko'p joylarda ko'p marta hujjatlashtirilgan, ammo ikkita asosiy farq shundaki, let bloklangan va TDZ (vaqtinchalik o'lik zona) ni yaratadi, ya'ni siz uni deklaratsiyadan oldin ishlata olmaysiz yoki hatto havola qila olmaysiz. - person kangax; 29.09.2015
comment
@kangax Men buni tushunaman. Men shunchaki aytmoqchimanki, agar let haqida hech qachon eshitmagan odam bu javobga duch kelsa, let ni eslatib o'tish va ular o'qishlari uchun boshqa ma'lumot manbasiga havola qilish yaxshi bo'lar edi. - person Snekse; 29.09.2015

Buni "mahalliy va global" o'rtasidagi farq deb aytish mutlaqo to'g'ri emas.

Buni "mahalliy va eng yaqin" o'rtasidagi farq deb hisoblagan ma'qul. Eng yaqini, albatta, global bo'lishi mumkin, lekin bu har doim ham shunday bo'lmaydi.

/* 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;
    }
}
person Jonathan Lonowski    schedule 24.09.2009
comment
Siz var global = false; ni belgilaydigan eng yaqin outer doirasi emasmi? - person Snekse; 19.04.2013
comment
@Snekse: "eng yaqin" ‹code›var global = false;‹/code› e'lon qilinganda qo'llanilmaydi. Ushbu deklaratsiyada "global" tashqi() doirasiga joylashtirilgan, chunki deklaratsiyada "var" ishlatiladi. "var" inner() da ishlatilmagani uchun u tashqi () bo'lgan keyingi darajadagi yuqoridagi qiymatni o'zgartiradi. - person Mitch; 18.09.2015
comment
Qiziq, agar siz ushbu qatorni var global = local; ga o'zgartirsangiz, sharhingiz o'zgaradimi, bu holda mahalliyning yaqin doirasi faol aniqlanayotgan mahalliy tashqi doira bo'ladi. Agar siz o'sha qatorni var global = global ga o'zgartirsangiz, g'alati bo'lsa-da, bu holda global qiymatini qidirishda eng yaqin qamrov global oyna doirasi darajasida yuqori bo'ladi. - person Snekse; 24.09.2015

Brauzerda Javascript bajarilganda, sizning barcha kodingiz with iborasi bilan o'ralgan bo'ladi, masalan:

with (window) {
    //Your code
}

Batafsil ma'lumot with - MDN

var o'zgaruvchini joriy doirada e'lon qilganligi sababli, var ichki oynani e'lon qilish va uni umuman e'lon qilmaslik o'rtasida farq yo'q.

Farqi siz to'g'ridan-to'g'ri deraza ichida bo'lmaganingizda paydo bo'ladi, masalan. funktsiya ichida yoki blok ichida.

var dan foydalanish bir xil nomga ega bo'lgan tashqi o'zgaruvchilarni yashirish imkonini beradi. Shu tarzda siz "xususiy" o'zgaruvchini simulyatsiya qilishingiz mumkin, ammo bu boshqa mavzu.

Asosiy qoida har doim var dan foydalanishdir, chunki aks holda siz nozik xatolarni kiritish xavfini tug'dirasiz.

EDIT: Men olgan tanqidlardan so'ng, men quyidagilarni ta'kidlamoqchiman:

  • var oʻzgaruvchini joriy doirada eʼlon qiladi
  • Global qamrovi window
  • var dan foydalanmaslik global miqyosda var ni bilvosita e'lon qiladi (oyna)
  • O'zgaruvchini global miqyosda (oynada) var yordamida e'lon qilish uni o'tkazib yuborish bilan bir xil.
  • O'zgaruvchini oynadan farqli doiralarda var yordamida e'lon qilish bir xil narsa emas o'zgaruvchini varsiz e'lon qilish
  • Har doim var ni aniq e'lon qiling, chunki bu yaxshi amaliyot
person kentaromiura    schedule 24.09.2009
comment
Men sizga ovoz bermadim, lekin miqyos oynadan ko'ra yaxshiroq so'zdir. Sizning tushuntirishingiz biroz tushunarsiz. - person Robert Harvey; 25.09.2009
comment
Men narsalarni shunchaki o'z nomi bilan chaqiraman, siz uni global miqyos deb atashni xohlaysiz, bu yaxshi, lekin mijoz tomoni, qoidaga ko'ra, oyna ob'ektidir, bu qamrov zanjirining oxirgi elementidir, shuning uchun siz har bir funktsiyani chaqirishingiz mumkin va yozish oynasisiz oynadagi har bir ob'ekt. - person kentaromiura; 25.09.2009
comment
+1 bu juda zo'r tushuntirish - men ilgari bu kabi tuzilgan var/no var muammosini eshitmaganman. - person doug; 10.04.2012
comment
Bu javobning aksariyati ES6 da let bilan eskirgan. - person Evan Carroll; 21.01.2014
comment
@EvanCarroll Bu javob texnik jihatdan ham noto'g'ri, chunki var o'tkazib yuborilsa, hech qanday o'zgaruvchini e'lon qilmaydi, aksincha u global ob'ektda o'chiriladigan xususiyatni yaratadi, ES5 qat'iy rejimdan foydalanish bilan bir qatorda, javobning aksariyati to'g'ri emas, shuningdek, ruxsat berilmagan bu javobda ko'rib chiqildi, chunki savol vaqtida JavaScript versiyasiga (kecha qo'shilgan) havola yo'q edi, bu esa havola standarti (o'sha paytda) ECMA 262 3-nashr ekanligini anglatadi. - person kentaromiura; 22.01.2014
comment
Sizning barcha kodlaringiz with iborasi bilan o'ralgan bayonoti aniq noto'g'ri. Agar bu to'g'ri bo'lsa, o'zgaruvchilar nomlari oyna obyektida mahalliy doiradan oldin hal qilinadi. - person RobG; 07.11.2017

O'zgaruvchilarni e'lon qilish uchun har doim var kalit so'zidan foydalaning. Nega? Yaxshi kodlash amaliyoti o'z-o'zidan sabab bo'lishi kerak, lekin uni tashlab qo'yish uglobalda e'lon qilinganligini anglatadi (bunday o'zgaruvchi "ko'zda tutilgan" global deb ataladi). Duglas Krokford hech qachon nazarda tutilgan global ma'lumotlardan foydalanmaslikni tavsiya qiladi va Apple JavaScript-ni kodlash bo‘yicha qo‘llanma a>:

var kalit so'zisiz yaratilgan har qanday o'zgaruvchi global miqyosda yaratiladi va funktsiya qaytganida (chunki u ko'lamdan tashqariga chiqmagani uchun) yig'ilmaydi, bu esa xotiraning oqishiga olib keladi.

person Steve Harrison    schedule 24.09.2009
comment
Yaxshi kodlash amaliyoti hech qachon o'z-o'zidan etarli sabab bo'lmasligi kerak. Internetdagi ba'zi bolalar mening kodim shunday ko'rinishi kerakligini aytishdi. Bu mening o'qituvchim aytganidan ham unchalik to'g'ri kelmaydi, agar biror kishi hech bo'lmaganda qoida ortidagi sababni tushunmasa. - person cHao; 24.05.2013
comment
@cHao Menimcha, good coding practice har doim bir nechta Javascript mualliflari tomonidan tavsiya etilgan eng yaxshi amaliyot bo'lsa, etarli sababdir. - person Chris S; 03.01.2014
comment
@ChrisS: Yo'q, yaxshi kodlash amaliyoti o'z-o'zidan sabab emas. Bu yaxshi amaliyot deb hisoblangan sabab muhimi. Agar mualliflar nima uchun buni tavsiya qilishlarini aytmasalar, ularning tavsiyalari hech qanday ahamiyatga ega bo'lmasligi kerak. Agar siz sabablarga rozi bo'lmasangiz, unda siz buni yomon maslahat deb bilishingiz mumkin. Va agar siz nima uchun hech qachon so'ramasdan unga ergashsangiz, yuk kultizmi shunday boshlanadi. - person cHao; 03.01.2014

var bilan mahalliy o'zgaruvchilarni e'lon qilmaslikdan qanday qutulish mumkinligiga juda yaxshi misol:

<script>
one();

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

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

(i siklning har bir iteratsiyasida qayta oʻrnatiladi, chunki u for tsiklida mahalliy emas, balki global miqyosda e'lon qilingan) oxir-oqibat cheksiz tsiklga olib keladi

person Chris S    schedule 24.09.2009
comment
Xayr! Men bu xato tufayli yuzaga kelishi mumkin bo'lgan barcha xatolarni tasavvur qila olaman. - person BonsaiOak; 13.10.2014
comment
Menga qiziq, nega i ni ikkita() ga argument sifatida o'tkazyapsiz? (for loop ichida) bu ortiqchami? - person kalin; 03.10.2016
comment
Ikki() funksiyasi parametrsiz aniqlanganligi sababli, one() funksiyasiga kiritilgan two() funksiyasida argument e'tiborga olinmaydi. Siz juda to'g'ri aytdingiz, bu kerak emas, chunki u rol o'ynamaydi. - person KK.; 24.02.2017
comment
Xato yoki xususiyatmi? - person TheMaster; 25.08.2019

Ko'p hollarda var dan foydalanish yaxshiroq, deyman.

Mahalliy o'zgaruvchilar har doim global miqyosdagi o'zgaruvchilardan tezroq.

Agar oʻzgaruvchini eʼlon qilish uchun var dan foydalanmasangiz, oʻzgaruvchi global miqyosda boʻladi.

Qo'shimcha ma'lumot olish uchun Google'da "JavaScript qamrovi zanjiri" ni qidirishingiz mumkin.

person Billy    schedule 24.09.2009
comment
Agar siz var kalit so'zidan foydalanib o'zgaruvchini e'lon qilsangiz, u ish vaqtida yaratiladi, shuning uchun u sekinroq bo'lishi kerak emasmi? Chunki ikkinchisi tahlil qilingan vaqtda yaratilgan. - person Barış Velioğlu; 14.08.2012
comment
@RyuKaplan - hey, bu rostmi? Men googlingni sinab ko'rdim va mavzu bo'yicha hech qanday ma'lumot ololmadim! Bu da'vo uchun manba vakolatingiz bormi? Rahmat - person mike rodent; 12.04.2013
comment
@RyuKaplan Tahlil qilish/kompilyatsiya qilish aslida kodni ishlatishdan farq qiladi. - person gcampbell; 08.07.2016

var ishlatmang!

var o'zgaruvchini e'lon qilishning ES6 dan oldingi usuli edi. Biz endi kelajakdamiz va siz shunday kodlashingiz kerak.

const va let dan foydalaning

const 95% hollarda qo'llanilishi kerak. Bu o'zgaruvchan havolani o'zgartira olmasligini ta'minlaydi, shuning uchun massiv, ob'ekt va DOM tugunining xususiyatlari o'zgarishi mumkin va const bo'lishi mumkin.

let qayta tayinlanishi kutilayotgan har qanday o'zgaruvchi uchun ishlatilishi kerak. Bunga for tsikli kiradi. Agar siz initsializatsiyadan tashqari varName = yozsangiz, let dan foydalaning.

Boshqa tillarda kutilganidek, ikkalasi ham blok darajasiga ega.

person Gibolt    schedule 15.08.2017
comment
Barcha "var" ni "const" bilan almashtiring (hammasini almashtiring). Qayta tayinlangan o'zgaruvchilaringiz qayerda ekanligini tezda sezasiz. Agar sizda ularning soni juda ko'p bo'lsa, ehtimol anti-patternly kodlashingiz mumkin: ko'pchilik qayta tayinlanadigan o'zgaruvchilar yopilish yoki ob'ekt xususiyatlari sifatida ko'milishi mumkin. Agar sizda bir nechta bo'lsa: ular uchun "let" dan foydalaning. Nihoyat, agar ba'zi o'zgaruvchilar "var" bilan umuman e'lon qilinmagan bo'lsa, ular e'lon qilinmagan holda qoladi va hali ham global makonda mavjud bo'lsa, ehtiyot bo'ling. @Gibolt sharhi haqida "for tsikli ichida" 95% hollarda bunday tsikllardan qochish tavsiya etiladi ;-): massiv usullari ajoyib. - person allez l'OM; 21.10.2018
comment
95% hollarda const dan foydalanish kerak, deb aytish bilan, biz yaxshi amaliyotdan va dogmaga ketayotganga o'xshaymiz. - person Agamemnus; 28.12.2018

boshqa farq, masalan

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

esa

a = a || [] ; // a is undefined error.
person Pranay Warke    schedule 09.08.2013
comment
Nima uchun "var" bilan aniqlangan o'zgaruvchi va var bilan aniqlanmagan o'zgaruvchida ishlashini tushuntirib bera olasizmi? O'zgaruvchi var holatida topshiriqning o'ng tomonini baholashdan oldin yaratilganmi? - person matt; 05.12.2013
comment
@Lucek, chunki var a sohaning yuqori qismiga ko'tariladi va o'zgaruvchini e'lon qiladigan, lekin ishga tushirmaydigan null qiymatiga o'rnatiladi, keyin topshiriqda siz noto'g'ri deb baholanadigan noaniq null o'zgaruvchiga havolaga egasiz va topshiriqni [] ga o'rnatasiz. Ikkinchisida, siz a mulkining a xususiyatiga topshirig'ingiz bor. Siz mavjud bo'lmagan xususiyatni belgilashingiz mumkin -- uni topshiriq bo'yicha yaratish, lekin sizga ReferenceError tashlanmasdan mavjud bo'lmagan xususiyatdan o'qiy olmaysiz. - person Evan Carroll; 20.01.2014
comment
@EvanCarroll: u doiraning yuqori qismiga ko'tariladi va null o'rniga undefined ga o'rnatiladi. - person Mithun Satheesh; 25.09.2014

var dan foydalanish har doim o'zgaruvchilar global miqyosni chalkashtirib yuborishi va o'zgaruvchilar bir-biriga zid bo'lishining oldini olish uchun yaxshi fikr bo'lib, istalmagan qayta yozishga olib keladi.

person kevinji    schedule 04.04.2011

varsiz - global o'zgaruvchi.

DOIMO var iborasidan foydalanish tavsiya etiladi, chunki mahalliy kontekstda init global o'zgaruvchisi - yomon. Ammo, agar sizga bu iflos hiyla kerak bo'lsa, sahifaning boshida sharh yozishingiz kerak:

/* global: varname1, varname2... */
person Anatoliy    schedule 24.09.2009

Bu tushunchani tushunishingiz uchun men yozgan misol kodi:

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
person Community    schedule 27.10.2013
comment
Funktsiya hech qanday tarzda anonim emas. Aslida, u iloji boricha ko'rinadigan darajada nomlanadi. - person Ingo Bürk; 23.01.2014
comment
Anonim funksiyani aslida anonim qilish uchun Ingo Burkning izohiga javoban javobingizni tahrir qilganingiz uchun tashakkur. - person Dave Burton; 09.09.2016

@Kris S var va yo'q var o'rtasidagi amaliy farqni (va xavfni) ko'rsatuvchi yaxshi misol keltirdi. Mana yana biri, men buni ayniqsa xavfli deb bilaman, chunki farq faqat asinxron muhitda ko'rinadi, shuning uchun u sinov paytida osongina o'tib ketishi mumkin.

Siz kutganingizdek, quyidagi snippet natijalari ["text"]:

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

console.log(var_fun())

Quyidagi parcha ham shunday (array dan oldin etishmayotgan let ga e'tibor bering):

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

console.log(var_fun())

Ma'lumotlar manipulyatsiyasini asinxron tarzda bajarish bitta ijrochi bilan bir xil natijani beradi:

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

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

Ammo bir nechtasi bilan boshqacha harakat qiladi:

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

Biroq, let dan foydalanish:

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

person thisismydesign    schedule 29.12.2017
comment
@thisismydesign misoli uchun rahmat! Oxirgi ikkita misolga kelsak, nima uchun oxirgi misol 3 ta elementdan iborat massivni matnni uch marta yozadi, oxirgi misol esa massiv ichidagi har bir element uchun faqat bir marta matnni qayd qiladi? (Men tushunamanki, oxirgisi massivni o'zgaruvchi sifatida e'lon qiladi va shuning uchun mahalliy miqyosda bo'ladi, holbuki oxirgi misol buni o'tkazib yuboradi va massivni nazarda tutilgan global qamrovning bir qismi qiladi.) Lekin, nima uchun bu mahsulotga qanday ta'sir qiladi? Buning sababi forEach i funksiya va barcha global o'zgaruvchilar ustidan takrorlanadimi? - person Brad Ahrens; 22.09.2019

Buni o'rganishga harakat qilayotgan odam sifatida men buni shunday ko'raman. Yuqoridagi misollar yangi boshlanuvchilar uchun biroz murakkab edi.

Agar siz ushbu kodni ishga tushirsangiz:

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

Chiqish quyidagicha o'qiladi: noto'g'ri, noto'g'ri, rost, rost

Funktsiyadagi o'zgaruvchilarni uning tashqarisidagilardan alohida ko'rganligi sababli, mahalliy o'zgaruvchi atamasi va bu biz topshiriqda var dan foydalanganimiz uchun. Funktsiyadagi var ni olib tashlasangiz, u endi shunday o'qiydi:

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

Chiqish noto'g'ri, noto'g'ri, noto'g'ri, noto'g'ri

Buning sababi shundaki, mahalliy miqyosda yoki funktsiyada yangi o'zgaruvchi yaratish o'rniga u global o'zgaruvchilardan foydalanadi va ularni yolg'onga qayta tayinlaydi.

person Danrex    schedule 01.10.2016

Ko'rib turibmanki, odamlar o'zgaruvchilarnivarli yoki funksiyasiz, funksiya ichida yoki tashqarisida e'lon qilishda chalkashib ketishadi. Mana sizga ushbu qadamlar orqali yordam beradigan chuqur misol:

Quyidagi skriptni jsfiddle orqali ko‘ring

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

Xulosa

  1. Var bilan yoki bo'lmasdan e'lon qilinganidan qat'iy nazar (a, b kabi) agar ular o'z qiymatini funktsiyadan tashqarida olsalar, ular o'z qiymatini saqlab qoladilar va skript orqali turli funktsiyalarga qo'shilgan boshqa qiymatlar ham saqlanib qoladi.
  2. Agar o'zgaruvchi funktsiya ichida varsiz e'lon qilinsa (masalan, c), u avvalgi qoida kabi ishlaydi va bundan buyon barcha funktsiyalarda o'z qiymatini saqlab qoladi. Yoki u testVar1() funktsiyasida o'zining birinchi qiymatini oldi, u hali ham qiymatni saqlab qoladi va testVar2() funktsiyasida qo'shimcha qiymat oladi.
  3. Agar o'zgaruvchi faqat funksiya ichida var bilan e'lon qilingan bo'lsa (masalan, testVar1 yoki testVar2 da d), funktsiya tugashi bilan u aniqlanmagan bo'ladi. Shunday qilib, u funktsiyada vaqtinchalik o'zgaruvchi bo'ladi.
person Tarik    schedule 20.11.2016
comment
Ushbu mavzuni ko'rsatish uchun misol yaratishga vaqt ajratganingiz uchun tashakkur. Yuqoridagi kodda quyidagi qism yoʻq, shuning uchun javobingizni tahrirlashni xohlashingiz mumkin: a = 1;// Funksiyadan tashqarida var var b = 1siz belgilangan;// Var alert bilan funksiyadan tashqarida belgilangan (Barcha funksiyalardan tashqarida boshlanadi. .. \n \n a, b aniqlangan, lekin c, d hali aniqlanmagan: \n a: + a + \n b: + b + \n \n (Agar men aniqlanmagan c yoki d qiymatini ko'rsatishga harakat qilsam, konsol. log "Uchaught ReferenceError: c is not defined" xatosini chiqaradi va skript ishlashni to'xtatadi!)); - person Sankofa; 11.10.2018

Kod ichida siz var ishlatmasdan o'zgaruvchidan foydalansangiz, avtomatik ravishda var var_name global miqyosga joylashtiriladi, masalan:

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 */
}
person Akash Arora    schedule 13.08.2013

Ko'lamlar masalasidan tashqari, ba'zi odamlar ko'tarish haqida ham eslatib o'tishadi, lekin hech kim misol keltirmadi. Bu global miqyos uchun:

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

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

person deathangel908    schedule 05.09.2019

"Var" dan foydalanmasdan o'zgaruvchilar faqat qiymat o'rnatilganda aniqlanishi mumkin. Masalan:

my_var;

global miqyosda yoki boshqa miqyosda ishlay olmaydi. U quyidagi qiymatga ega bo'lishi kerak:

my_var = "value";

Boshqa tomondan, siz kabi o'zgaruvchini belgilashingiz mumkin;

var my_var;

Uning qiymati undefined (Uning qiymati null emas va u null ga teng emas.).

person umut    schedule 27.04.2014
comment
my_var; aslida haqiqiy ifoda bayonotidir. - person lexicore; 27.11.2014
comment
Agar o'zgaruvchi avval aniqlangan bo'lsa, bu to'g'ri bayonotdir. Aks holda xatolik yuz beradi ... aniqlanmagan. - person umut; 27.11.2014
comment
Bu o'zgaruvchining avval aniqlangan yoki aniqlanmaganligidan qa'ri nazar to'g'ri bayonotdir. :) Yaroqli bayonot xatoga yo'l qo'yishi mumkin, u bayonotni bekor qilmaydi. - person lexicore; 27.11.2014
comment
Men bu borada gangib qoldim. To'g'ri bayonot nima? Va menga noto'g'ri bayonot misolini keltira olasizmi? - person umut; 27.11.2014
comment
Men kechirim so'rashim kerak - oxirgi paytlarda juda ko'p ECMAScript grammatikasi. my_var; haqiqiy ifoda bayonoti. /my_var; noto'g'ri bayonot bo'ladi. Lekin aytganimdek, bu grammatik kazuistika, kechirim so'rayman, mening sharhim aslida mos emas edi. - person lexicore; 27.11.2014

Agar oʻzgaruvchini brauzerda oyna obyektiga biriktirmoqchi boʻlmasangiz, var kalit soʻzidan foydalanishingiz kerak. Mana bu havolada qamrovni aniqlash va var kalit so'zi bilan va bo'lmagan holda glokal qamrov va mahalliy miqyos o'rtasidagi farq.

O'zgaruvchilar var kalit so'zidan foydalanmasdan aniqlanganda, bu oddiy "tayinlash" operatsiyasiga o'xshaydi.

Qiymat javascriptdagi o'zgaruvchiga tayinlanganda, tarjimon avval "o'zgaruvchi deklaratsiyasini" tayinlash bilan bir xil kontekst/ko'lamda topishga harakat qiladi. Tarjimon dummyVariable = 20 ni bajarganda, funktsiya boshida dummyVariable deklaratsiyasini qidiradi. (Chunki barcha o'zgaruvchan deklaratsiyalar javascript tarjimoni tomonidan kontekstning boshiga ko'chiriladi va bu ko'tarish deb ataladi)

Shuningdek, siz ko'tarishni ko'rib chiqishingiz mumkin. javascript

person S Khurana    schedule 12.12.2016