Для объема переменных, такие языки, как C, Java принимает метод «сфера действия блока». Напротив, JavaScript использует метод «Область функции» - область сферы переменной определяется только функцией, в которой он находится, и не имеет ничего общего с логическими блоками, такими как если и для. Например, в следующем примере показано поведение в JavaScript, которые отличаются от таких языков, как C и Java:
Кода -копия выглядит следующим образом:
function () {
var s = 42; // с виден на протяжении всей функции
if (s> 3) {
var x = "test"; // x виден по всей функции
для (var i = 0; i <10; i ++) {
console.log (i);
}
console.log (i); // i виден на протяжении всей функции
}
console.log (i);
console.log (x);
}
На языках «сфера действия блоков», таких как C и Java, после логических блоков, таких как операторы, и для операторов выполнены, переменные, определенные внутри этих логических блоков, будут уничтожены. JavaScript отличается. Пока переменная определена в функции, все коды во всей функции могут получить доступ к переменной, даже если коды представлены до определения переменной:
Кода -копия выглядит следующим образом:
function () {
Console.log (a); // не определен
var a = "test";
Console.log (a); // тест
}
В приведенном выше примере, если A никогда не определяется в функции, Console.Log (A) выбросит ссылку. Когда A определяется в функции, даже если это определение является после оператора переменной ARAIL, вызов AS AS является юридической операцией (если определение переменной происходит после оператора вызова, значение переменной в операторе вызова не определена). Фактически, все переменные, определенные с ключевым словом VAR в функции, будут поднимаются в начале функции (операция назначения остается на строке, определенной VAR), которая называется подъемом в JavaScript. Например, приведенный выше код эквивалентен:
Кода -копия выглядит следующим образом:
function () {
var a;
Console.log (a); // не определен
a = "test";
Console.log (a); // тест
}
Цепочка переменных
Обращение к хранению переменных в JavaScript может обеспечить хорошее понимание «область функции» и подъема в JS. Поскольку переменные хранятся в глобальных объектах или объектах вызова функций, при определении переменной в функции, независимо от того, где переменная определена в вызове функции, свойство с тем же именем, что и эта переменная, неизбежно будет отображаться в объекте вызова функции, используемом этим вызовом функции. Это позволяет получить доступ к переменной в любом месте функции.
Когда дело доходит до вызовов функций, в JavaScript есть еще одна более интересная концепция: цепочка переменных с областями сферы - поскольку переменные хранятся на глобальных объектах или объектах вызова функций, при доступе к переменным вы можете получить значения из нескольких объектов. Следующий код является примером:
Кода -копия выглядит следующим образом:
var x = "test";
function () {
// функция уровня 1
var x = "temp";
function () {
// функция уровня 2
var x = "Real";
// Попробуйте получить доступ к X здесь. X будет "настоящим".
}
}
Внутри функции уровня 2 в приведенном выше коде, при попытке получить доступ к переменной x программа может искать соответствующие значения атрибутов из 3 объектов: объект вызова функции, используемый для вызова функции уровня 2, объект вызова функции, используемый для вызова функции уровня 1, и глобальный объект - в соответствии с вложенным отношением, определенным функцией, JavaScript будет генерировать цепочку объекта, составленную из объекта глобального объекта и функции. При доступе к переменным программа начнет поиск из объекта, ближайшего к оператору Access. Если поиск не будет найден, он будет продолжать искать в объекте на предыдущем уровне в цепочке объектов до глобального объекта.
Поскольку эта цепочка объекта связана с объемом переменной, она также называется «цепочкой области».
Если вам необходимо временно изменить цепочку применения и вставить объект в передний конец цепочки объема (в качестве объекта функции, к которому можно получить доступ), вы можете использовать оператор:
Кода -копия выглядит следующим образом:
с (o) {
// код Используйте свойства объекта o.
}
Однако в строгом режиме JavaScript, с отключениями отключено; Даже в безложении, с заявлениями не рекомендуется.