JavaScript

Локальные и глобальные переменные

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

function onMouseMove(event) {
path.firstSegment.point = event.point;
for (var i 0; i < points - 1; i++) {
var segment = path.segments[i];
var nextSegment = segment.next;
var vector = segment.point - nextSegment.point;
vector.length = length;
nextSegment.point = segment.point - vector;
}
path.smooth({ type: 'continuous' });
}
Если ВНУТРИ функции перед именем переменной стоит var - это переменная является локальной для всего кода этой функции.
Если перед именем переменной стоит let (судя по тому, что в твоём коде let нет, на этих "курсах" СОВРЕМЕННЫЙ JavaScript НЕ изучают) - эта переменная локальна от let до соответствующей '}'.

ВСЕ прочие переменные являются глобальными. И это одна из тех ошибок в дизайне языка, которая никогда не будет исправлена.

Для ответов на такие вопросы есть хороший учебник JavaScript: https://learn.javascript.ru/
RA
Ruslan Alikhanov
94 866
Лучший ответ
Алексей Мазаев А почему это "ошибка", а не особенность?)
ну смотрите - у вас функция
переменная объявленная за пределами функции глобальная
let a = "string";
function (){
переменная объявленная внутри будет локальная
let a = "string";
}
ЮК
Юра Курдюков
66 671
Вопрос с подвохом) Когда объявляется функция, на самом деле создается переменная с названием функции, которая хранит ссылку на эту функцию.

Глобальными получаются все переменные, объявленные непосредственно внутри тега script. Всё остальное, что объявляется внутри функций - не видно снаружи, они локальные.

<script>
var global = "глобальная";

function globalFunc(){ // globalFunc - глобальная.
var a = "локальная"
}

if( true ) {
var a = "глобальная";
  let b = "локальная. Это разница между let и var"
}
</script>

P.s. в коде из вопроса, path и points - должно быть предполагаются глобальными, но на самом деле невозможно сказать, т. к. вся эта функция может оказаться внутри другой функции, тогда здесь вообще нет глобальных.
>> что такое локальные, а что глобальные переменные ...
Это концепция которую используют в компилируемых языках программирования таких как С/С++. для того чтобы указать способ размещения переменной в памяти и время ее жизни. Это важно для размещения объектов в памяти.
В JavaScript не используют такую концепцию.

Вместо этого использую концепцию глобального объекта и набор правил для разрешения имен переменных.
Когда в JS говорят про глобальные переменные подразумевают свойства глобального объекта.
Любой код в JS всегда исполняется в каком то контексте (текущем окружении) глобальный объект является частью контекста исполнения.
Так же важной частью контекста исполнения является _текущая_ область видимости.

Переменные объявленные с помощью ключевых слов "var" "let" и "function" размещаются в "текущей область видимости" (т. е. считаются локальными ...).

Когда исполнение скрипта встречает в коде переменную запускается механизм разрешения имени переменной. Сначала имя ищется в текущей области видимости, если такого имени тут нет то имя ищется в вышестоящей области видимости и так пока не дойдет до самой высшей области видимости которой всегда является глобальный объект,
если имя так и не найдено то запускается механизм объявления переменной и переменная создается.

Именно из за такой механики поиска и правила что переменная создается в текущей области видимости явно не объявленные переменные становятся свойствами глобального объекта т. е. так называемыми глобальными переменными.

Код скрипта начинает исполнятся и текущей областью видимости является глобальный объект все переменные которые тут объявляются становятся глобальными.
когда в коде встречаются { ...} то создается новая область видимости и переменные у которых есть объявление "let" "const" и "function" становятся локальными. "var" становится локальной только в коде функции.
Болат ***жанай***
Болат ***жанай***
12 592