Яка мета ключового слова var і коли я повинен його використовувати (або пропустити)?


1543

ПРИМІТКА . Це питання було задано з точки зору версії 3 або 5. ECMAScript. Відповіді можуть застаріти, якщо з'явиться нові можливості у випуску ECMAScript 6.

Яка саме функція varключового слова в JavaScript, і в чому різниця між

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/…
Скотт C Вілсон

5
Публікація з мелокартки @Ray Toal (безумовно, варто прочитати) перейшла на blog.safeshepherd.com/23/how-one-missing-var-ruined-our-launch
Гефест

Я ніколи не уявляв, що вірш може надихнути мене на розгляд програмної проблеми
Фелікс Ганьон-Греньє

1
@ Gibolt, але подивіться на дату питання, це начебто несправедливо викликає питання 2009 року, щоб сказати це. Незважаючи на те, що він як і раніше діє як для поточної дати для ремонту, там є купа не "сучасного JS" коду.
Andre Figueiredo

Відповіді:


1356

Якщо ви перебуваєте в глобальному масштабі, то різниці немає. Прочитайте відповідь Kangax для пояснення

Якщо ви знаходитесь у функції, тоді varстворите локальну змінну, "no 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' перед змінною і, нарешті, змінити змінну десь у ланцюзі області ... Спробуйте переконати Java / C / Python / тощо. розробник, що JavaScript вартий. Га! Підводні камені C / C ++ виглядають приємно на противагу. Уявіть, що вам доведеться налагоджувати JavaScript ... І, звичайно, це роблять деякі люди. І так багато коду (і не простий код, пам’ятайте) написано на JavaScript ...
Albus Dumbledore

6
Якщо ви перебуваєте в глобальному масштабі, то різниці немає. >> Є різниця, яка пояснюється у відповіді нижче
Макс Корецький

746

Є різниця .

var x = 1 декларує змінну x в поточному обсязі (він же контекст виконання). Якщо декларація з'являється у функції - оголошується локальна змінна; якщо це в глобальному масштабі - оголошується глобальна змінна.

x = 1з іншого боку, це лише призначення власності. Спочатку вона намагається вирішити xпроти сфери застосування. Якщо він знайде його де-небудь у цьому діапазоні, він виконує завдання; якщо він не знаходить x, тільки тоді він створює xвластивість для глобального об'єкта (який є об'єктом верхнього рівня в ланцюзі області).

Тепер зауважте, що вона не оголошує глобальну змінну, вона створює глобальну властивість.

Різниця між ними є тонкою і може бути заплутаною, якщо ви не розумієте, що декларації змінних також створюють властивості (лише на змінному об'єкті) і що кожна властивість у Javascript (ну, ECMAScript) має певні прапори, що описують їх властивості - ReadOnly, DontEnum та DontDelete.

Оскільки декларація змінної створює властивість за допомогою прапора DontDelete, різниця між var x = 1та x = 1(при виконанні в глобальному масштабі) полягає в тому, що колишня заява про змінну - створює властивість DontDelete'able, а остання - ні. Як наслідок, властивість, створене за допомогою цього неявного призначення, може бути видалено із глобального об'єкта, а попереднє - створене за допомогою змінної декларації - неможливо видалити.

Але це, звичайно, лише теорія, і на практиці є ще більше відмінностей між ними , через різні помилки у впровадженні (наприклад, у IE).

Сподіваюся, це все має сенс:)


[Оновлення 16.12.2010]

У ES5 (ECMAScript 5; нещодавно стандартизована, 5-е видання мови) існує так званий "суворий режим" - режим мовлення, який трохи змінює поведінку незадекларованих завдань. У жорсткому режимі присвоєння незадекларованому ідентифікатору є ReferenceError . Обґрунтуванням цього було прийняття випадкових завдань, запобігання створенню небажаних глобальних властивостей. Деякі нові браузери вже почали прокручувати підтримку суворого режиму. Дивіться, наприклад, мою таблицю compat .


Якщо я пригадую правильно, я думаю, що одного разу я знайшов спосіб отримати змогу deleteоголосити змінну var за допомогою якогось evalзлому. Якщо я згадаю точну хитрість, я опублікую тут
Вежа

3
@Mageek Він може брати участь у оголошених змінних змінних, які можна видалити. Я писав про це в блозі одного разу.
кенгакс

1
Трохи поза темою, але тут згадка про це для довідки. "let" дуже схожий на "var" і підтримується в Mozilla. Основна відмінність полягає в тому, що сфера застосування змінної var - це вся функція, що укладає, де "нехай" обмежується її блоком
mac

@kangax, що якщо два останні рядки прикладів Алекса змішати: 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;?
Снексе

@Snekse: "найближчий" не застосовується, коли оголошено <code> var global = false; </code>. У цій декларації "глобальний" міститься в області external (), оскільки "var" використовується в декларації. Оскільки "var" не використовується у внутрішньому (), він змінить значення на наступному рівні вгору, який є зовнішнім ().
Мітч

Цікаво, чи змінився б ваш коментар, якби ви змінили цей рядок, і var global = local;в такому випадку зовнішня область локального значення буде "локальною" зовнішньою областю, яка активно визначається. Хоча це стає дивним, якби ви змінили цей самий рядок на той, var global = globalу якому випадку найближчий обсяг при пошуку значення globalбуде на рівні рівня в глобальній області вікна.
Снексе

80

Коли Javascript виконується в браузері, весь ваш код оточений оператором a, наприклад:

with (window) {
    //Your code
}

Більше інформації про with- MDN

Оскільки varоголошує змінну в поточній області , немає різниці між тим, як оголосити var всередині вікна і взагалі не оголосити його.

Різниця виникає, коли ви не знаходитесь безпосередньо у вікні, наприклад, всередині функції або всередині блоку.

Використання varдозволяє приховати зовнішні змінні, що мають однакове ім'я. Таким чином ви можете імітувати "приватну" змінну, але це вже інша тема.

Основне правило - завжди використовувати var, оскільки в іншому випадку ви ризикуєте ввести непомітні помилки.

EDIT: Після критики, яку я отримав, я хочу наголосити на наступному:

  • varоголошує змінну в поточній області
  • Глобальний розмах є window
  • Не використовувати varнеявно декларується varв глобальному масштабі (вікно)
  • Оголошення змінної в глобальній області (вікні) за допомогою varтого ж, що і опускання її.
  • Оголошення змінної в областях, відмінних від використання вікон, var - це не те саме, що оголошення без змінvar
  • Завжди заявляйте varпрямо, тому що це добра практика

1
Я не відповідав вам, але область, мабуть, краще слово, ніж вікно. Ви ціле пояснення трохи тупі.
Роберт Харві

4
Я просто називаю речі з його ім'ям, ви хочете назвати це "глобальний діапазон", це нормально, але на стороні клієнта, за умовою, це об'єкт вікна, це останній елемент ланцюга області, тому ви можете зателефонувати кожному функція та кожен об'єкт у вікні без запису "вікно".
kentaromiura

2
+1 це дуже приємне пояснення - я раніше не чула, щоб ця проблема з var / no var була оформлена (не каламбур), як це раніше.
дог

Більшість цієї відповіді застаріли letв ES6.
Еван Керролл

3
@EvanCarroll Ця відповідь також технічно невірна, оскільки опущення var не оголошує жодної змінної, натомість створює властивість, що видаляється на глобальному об'єкті, крім того, у режимі ES5 "використовувати строгий" більшість відповідей, очевидно, не вірно, також нехай не було " t навіть не враховував цю відповідь, оскільки під час запитання не було жодної посилання на версію javascript (додана вчора), що означає, що еталонним еталоном (на той час) був ECMA 262 3rd Edition.
kentaromiura

43

Завжди використовуйте varключове слово для оголошення змінних. Чому? Хороша практика кодування повинна бути достатньою причиною сама по собі, але, опускаючи її, це означає, що вона оголошена в глобальному масштабі (така змінна називається "загальною" глобальною). Дуглас Крокфорд рекомендує ніколи не використовувати маються на увазі глобалі , а відповідно до Правил кодування Apple JavaScript :

Будь-яка змінна, створена без var ключового слова, створюється в глобальному масштабі і не збирається сміттям, коли функція повертається (бо вона не виходить із сфери застосування), представляючи можливість витоку пам'яті.


17
"Гарна практика кодування" ніколи не повинна бути достатньою причиною сама по собі. Це означає, що "деякі хлопці в Інтернеті сказали, що так повинен виглядати мій код". Це навіть менш справедливо, ніж "сказав мій учитель", якщо тільки хоча б невиразно не зрозуміти причину цього правила.
cHao

@cHao Я думаю, що good coding practiceце завжди є достатньою причиною, якщо це рекомендована найкраща практика, якою це є і від кількох авторів Javascript.
Chris S

8
@ChrisS: Ні, "хороша практика кодування" не є причиною сама по собі. Причина це вважається хорошою практикою є те , що має значення. Якщо ці автори не скажуть, чому вони рекомендують його, їх рекомендація не повинна мати жодної ваги. Якщо ви не згодні з причинами, тоді ви можете вважати це поганою порадою. І якщо ви дотримуєтесь цього, не запитуючи ніколи чому, саме так починається вантажний культ.
cHao

30

Ось досить хороший приклад того, як ви можете потрапити назовні через недекларування локальних змінних за допомогою var:

<script>
one();

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

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

( iскидається при кожній ітерації циклу, оскільки вона не оголошується локально в forциклі, а глобально), врешті-решт, це призводить до нескінченного циклу


Yikes! Я просто можу уявити всі помилки, які могли бути спричинені тими помилками.
BonsaiOak

2
Мені цікаво, чому ви передаєте i як аргумент двом ()? (всередині для for циклу) це зайве?
калін

Аргумент ігнорується двома () функціями, інкапсульованими однією функцією (), оскільки функція two () була визначена без параметра. Ви цілком правильні, вона не потрібна, оскільки вона не грає ролі.
КК.

Помилка чи функція?
TheMaster

13

Я б сказав, що краще використовувати varв більшості ситуацій.

Локальні змінні завжди швидші за змінні в глобальному масштабі.

Якщо ви не використовуєте varдля оголошення змінної, змінна буде в глобальному масштабі.

Для отримання додаткової інформації можна шукати "JavaScript ланцюга JavaScript" в Google.


Якщо ви оголосите змінну за допомогою ключового слова var, вона буде створена під час виконання, так чи не повинно бути повільніше? Тому що інший створюється в розбір часу.
Barış Velioğlu

@RyuKaplan - ей, це правда? Я спробував googling і не зміг отримати жодної інформації з цього питання! Чи є у вас джерело повноважень для цього твердження? Thx
мійський гризун

@RyuKaplan Парсинг / компіляція відрізняється від фактично запущеного коду.
gcampbell

11

Не використовуйте var!

varбув способом оголошення змінної перед ES6. Ми зараз у майбутньому , і ви повинні кодувати як таке.

Використовуйте constіlet

constслід використовувати в 95% випадків. Це робить його таким чином, що змінна посилання не може змінюватися, таким чином, властивості вузла масиву, об'єкта та DOM можуть змінюватися і, ймовірно, повинні бути const.

letслід використовувати для будь-якої змінної, яка очікує перепризначення. Це включає в себе цикл for. Якщо ви коли-небудь пишете varName =поза ініціалізацією, використовуйте let.

Обидва мають визначення рівня блоку, як і очікувалося в більшості інших мов.


2
Замініть все, що ви 'var', на 'const' (замініть всі). Ви швидко помітите, де знаходяться ваші перепризначені змінні. Якщо їх у вас занадто багато, ви, ймовірно, кодуєте анти-узор: більшість змінних змінних можуть бути вбудовані в закриття або як об'єкт-властивості. Якщо у вас є декілька: використовуйте для них "Let". Нарешті, якщо деякі змінні, де взагалі не затримуються з 'var', вони залишатимуться незадекларованими та все ще присутні в глобальному просторі, будьте обережні. Щодо коментаря @Gibolt "всередині циклу для циклу", також рекомендується уникати таких циклів у "95% випадків" ;-): методи масиву чудові.
allez l'OM

Кажучи, що const слід застосовувати у 95% випадків, схоже, ми йдемо від доброї практики та перетворюємось на догми.
Агамемнус

9

інша різниця, наприклад

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

поки

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

1
Чи можете ви пояснити, чому він працює у випадку змінної, визначеної 'var' та змінної, яка не визначена з var? Чи створюється змінна перед оцінкою правої частини завдання у випадку var?
мат

6
@Lucek через те var a, що піднімається на верхню частину області і встановлюється до нуля, який оголошує, але не ініціалізує змінну, тоді в призначенні ви маєте посилання на невизначену змінну нуля, яка оцінюється як false, і встановлюєте призначення []. В останньому у вас є присвоєння майна aвласності a. Ви можете призначити власність, яка не існує - створити її за призначенням, але ви не можете прочитати її з властивості, яка не існує, без того, щоб ReferenceErrorвас кинули.
Еван Керролл

1
@EvanCarroll: він піднімається на верхній план і встановлюється не визначеним, а не null.
mithunsatheesh

8

Використання varзавжди є хорошою ідеєю, щоб запобігти захаращуванню глобальної області застосування змінних, а змінні не конфліктувати між собою, викликаючи небажане перезапис.


8

Без var- глобальна змінна.

Настійно рекомендуємо ЗАВЖДИ використовувати varоператор, тому що init глобальна змінна в локальному контексті - це зло. Але, якщо вам потрібен цей брудний трюк, слід написати коментар на початку сторінки:

/* 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

@Chris S дав гарний приклад, демонструючи практичну різницю (та небезпеку) між 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())

Асинхронно виконуючи маніпуляції з даними, все одно дається однаковий результат з одним виконавцем:

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


Дякуємо за приклад @thisismydesign! Що стосується останніх двох прикладів, чому передостанній приклад записує масив із 3 елементів з текстом, написаним тричі, тоді як остаточний приклад записує "текст" один раз на елемент масиву? (Я розумію, що останній оголошує "масив" як змінну і тому знаходиться в локальному масштабі, тоді як передостанній приклад опускає це, перетворюючи "масив" на частину загальної глобальної області.) Але, чому це впливає на вихід? Це тому, що forEach "i" повторює функцію та всі глобальні змінні?
Майже Пітт

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

Вихід буде читати як: false, false, true, true

Оскільки він бачить змінні функції як окремі від тих, що знаходяться поза нею, отже, термін локальна змінна, і це було тому, що ми використовували 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);

Вихід хибний, хибний, хибний, хибний

Це тому, що замість того, щоб створити нову змінну в локальній області чи функції, вона просто використовує глобальні змінні та присвоює їм значення false.


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. Незалежно від того, декларовано з або без var (наприклад, a, b), якщо вони отримають своє значення поза функцією, вони збережуть своє значення, а також збережуться будь-які інші значення, додані всередині різних функцій за допомогою сценарію.
  2. Якщо змінна оголошена без var всередині функції (наприклад, c), вона буде діяти як попереднє правило, вона збереже своє значення для всіх функцій відтепер. Якщо воно отримало своє перше значення у функції testVar1 (), воно все ще зберігає значення та отримує додаткове значення у функції testVar2 ()
  3. Якщо змінна оголошена з var всередині функції (наприклад, d у testVar1 або testVar2), вона буде невизначена, коли функція закінчується. Так це буде тимчасовою змінною у функції.

Дякуємо, що знайшли час для створення прикладу, щоб продемонструвати цю тему. У наведеному вище коді відсутня частина нижче, тому ви, можливо, захочете відредагувати свою відповідь: a = 1; // Визначено за межами функції без var var b = 1; // Визначено за межами функції за допомогою var alar ("Початок поза всіма функціями) ... \ n \ na, b визначено, але c, d ще не визначено: \ na: "+ a +" \ nb: "+ b +" \ n \ n (Якщо я спробую показати значення невизначеного c або d, console.log кине "Uncaught ReferenceError: 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;насправді є дійсним висловом виразу.
lexicore

Це дійсне твердження, якщо змінна визначена раніше. В іншому випадку він видає помилку "... не визначено".
umut

3
Це дійсне твердження незалежно від того, була визначена змінна раніше чи ні. :) Дійсне твердження може викликати помилку, але воно не робить заяву недійсною.
lexicore

Я збентежений з цього приводу. Що таке дійсне твердження? І чи можете ви надати мені невірний приклад заяви?
umut

Мені доведеться вибачитися - останнім часом занадто багато граматики ECMAScript. my_var;є дійсним виразом виразів . /my_var;буде недійсним твердженням. Але, як я вже сказав, це граматична казуїстика, вибачаюсь, мій коментар насправді був невідповідним.
lexicore

0

Ви повинні використовувати ключове слово var, якщо ви не маєте права додавати змінну до об'єкта вікна в браузері. Ось посилання, що пояснює масштабність та різницю між глобальним масштабуванням та локальним масштабуванням із ключовим словом та без нього.

Коли змінні визначаються без використання ключового слова var, це виглядає як проста операція "призначення".

Коли значення присвоюється змінній у javascript, інтерпретатор спочатку намагається знайти "змінну декларацію" в тому ж контексті / області, що і в призначенні. Коли інтерпретатор виконує dummyVariable = 20, він шукає оголошення манекенаVariable на початку функції. (Оскільки всі мінливі декларації переміщуються на початок контексту за допомогою інтерпретатора JavaScript, і це називається підйомом)

Ви також можете подивитися на підйомники в JavaScript

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.