Пора встретиться с мистером Скопингом.
Проще говоря, область видимости - это инкапсуляция переменных (обратите внимание, что в javascript функции также являются переменными.) Теперь, на мнимом языке, который я только что составил, символ {
начинает область, а }
заканчивает ее переменные определяются с простым равенством (например, x = 42
):
{ |
x = 42; |
{ | |
y = "I'm in an inner scope!"; | |
x == 42; //true | |
{ | | |
x == 42; | | |
y == "I'm in an inner scope!"; | | |
| x, y, z are defined |
z = "pyramid time!"; | | |
y = y + "...not"; | | x, y are defined | x is defined
} | | |
y == "I'm in an inner scope!...not"; | |
//z is not defined | |
x = 4; | |
} | |
x == 4; |
//y is undefined |
//z is undefined |
} |
у javascript есть лексическая область видимости. Проще говоря, функции создают новую область видимости:
var x = 42;
(funciton () {
x === 42;
var y = 5;
})();
//y is undefined
Теперь есть дополнительное место, где можно создавать переменные, и это в аргументах функции. Две следующие функции ведут себя одинаково (arguments
- псевдомассив, содержащий параметры, переданные в функцию):
function parameterfull(a, b, c) {
//do stuff with a, b, c
}
function parameterless() {
var a = arguments[0], b = arguments[1], c = arguments[2];
//do stuff with a, b, c
}
Если вы не передадите аргумент, его значение будет undefined
.
Теперь, используя вашу функцию и приведенный выше перевод:
var AbcVar = "abc";
function Abc() {
var AbcVar = arguments[0];
console.log(AbcVar);
}
Итак, теперь вы понимаете, почему AbcVar
(иногда) undefined
внутри функции.
tl; dr Параметр функции AbcVar
переопределяет глобальную переменную AbcVar
, и, поскольку вы не передали значение функции, оно undefined
(но только внутри функция, глобальная AbcVar
остается прежней.)