Конфликты областей JavaScript
Я пытался понять область действия в JavaScript. Если я объявляю переменную вне функции, она является глобальной. Поэтому я протестировал следующий код, чтобы понять последовательность выполнения. В следующем коде я ожидал, что "demo1" примет глобальное значение, которое является "Volvo", поскольку я отрисовываю этот текст перед объявлением локальной переменной с тем же именем внутри функции. Но, к моему удивлению, я вижу ценность быть "неопределенный".
<!DOCTYPE html>
<html>
<body>
<p id="demo"></p>
<p id="demo1"></p>
<p id="demo2"></p>
<script>
var carName = "Volvo";
myFunction();
document.getElementById("demo").innerHTML = carName;
function myFunction() {
document.getElementById("demo1").innerHTML = carName;
var carName = "Volvo1";
document.getElementById("demo2").innerHTML = carName;
}
</script>
</body>
</html>
Результат:
Volvo
undefined
Volvo1
Я модифицировал далее, чтобы увидеть, что произойдет, если объявить другую глобальную переменную внутри функции следующим образом:
<!DOCTYPE html>
<html>
<body>
<p id="demo"></p>
<p id="demo1"></p>
<p id="demo2"></p>
<script>
var carName = "Volvo";
myFunction();
document.getElementById("demo").innerHTML = carName;
function myFunction() {
document.getElementById("demo1").innerHTML = carName;
//declaring another global variable
carName = "Volvo1";
document.getElementById("demo2").innerHTML = carName;
}
</script>
</body>
</html>
Результат:
Volvo1
Volvo
Volvo1
На этот раз" demo1 "принимает глобальную переменную, объявленную вне функции, то есть"Volvo".
Может ли кто-нибудь объяснить мне это?4 ответа:
В JavaScript это называется переменный подъем, который определяется как:
Одним из самых сложных аспектов JavaScript для новых разработчиков JavaScript является тот факт, что переменные и функции "поднимаются"."Вместо того, чтобы быть доступными после их объявления, они могли бы на самом деле будьте доступны заранее.
Значит второй ВАР декларации вашего
carName
переменная , исключая/исключая первый внутри функции.Потому что если объявить переменную с ключевым словом
var
в глобальной области вашего кода (начало вашего кода) и затем повторно объявить ту же переменную с ключевым словом var в другой области(функция, ...) это второе объявление исключит первое и это значение переменной становитсяundefined
.
Правка:
Вы можете увидеть В разделепеременная подъемная сила здесь влияние переменной подъемной силы и разница между переменной декларацией и переменная назначение:
Все объявления переменных поднимаются (поднимаются и объявляются) на вершину функции, если они определены в функции, или на вершину глобального контекста, если они находятся вне функции.
Важно знать, что только объявления переменных поднимаются до вершина, а не инициализация переменной или присвоения (когда переменная присваивается значение).
Это связано с поднятием декларации
var
. Итак, то, что происходит внутриmyFunction
, на самом деле выглядит примерно так:function myFunction() { // This declaration hides your carName from the outer scope var carName; // Var declared here by hoisting document.getElementById("demo1").innerHTML = carName; // undefined carName = "Volvo1"; // Assigned value document.getElementById("demo2").innerHTML = carName; }
Во втором примере вы обходите это объявление
Рабочий код: вот демо http://jsfiddle.net/patelmit69/qa34ky3z/
var carName = "Volvo"; myFunction(); document.getElementById("demo").innerHTML = carName; function myFunction() { document.getElementById("demo1").innerHTML = carName; carName = "Volvo1"; document.getElementById("demo2").innerHTML = carName; }
Это происходит из-за переменной подъемной силы. Объявления переменной поднимаются на вершину функции, поэтому ваша функция работает следующим образом:
Именно поэтому значениеfunction myFunction() { var carName; //declaration document.getElementById("demo1").innerHTML = carName; // here carName is not defined yet carName = "Volvo1"; //assignment document.getElementById("demo2").innerHTML = carName; }
#demo1
не определено.