范围是指代码某些部分中变量和函数的可用性。
在JavaScript中,变量具有两种范围:
- 全球范围
- 当地范围
全球范围
在程序顶部或函数外部声明的变量被视为全局范围变量。
让我们来看一个全局范围变量的例子。
// program to print a text
let a = "hello";
function greet () {
console.log(a);
}
greet(); // hello
在上述程序中,变量a在程序顶部声明,并且是全局变量。这意味着变量a
可以在程序中的任何位置使用。
全局变量的值可以在函数内部更改。例如,
// program to show the change in global variable
let a = "hello";
function greet() {
a = 3;
}
// before the function call
console.log(a);
//after the function call
greet();
console.log(a); // 3
在上面的程序中,变量a是全局变量。 a的值是打招呼 。然后在函数内部访问变量a ,其值更改为3。
因此,在函数内部更改a之后,其值将发生变化。
注意 :避免使用全局变量是一个好习惯,因为全局变量的值可以在程序的不同区域中更改。它可能会在程序中引入未知结果。
在JavaScript中,也可以在不声明变量的情况下使用变量。如果使用了未声明的变量,则该变量将自动成为全局变量。
例如,
function greet() {
a = "hello"
}
greet();
console.log(a); // hello
在上面的程序中,变量a是全局变量。
如果使用let a = "hello"
声明了变量,则程序将引发错误。
注意 :在JavaScript中,存在"strict mode";
在不声明变量的情况下不能使用该变量。要了解有关严格的更多信息,请访问JavaScript Strict 。
当地范围
变量也可以具有局部作用域,即只能在函数访问。
示例1:局部范围变量
// program showing local scope of a variable
let a = "hello";
function greet() {
let b = "World"
console.log(a + b);
}
greet();
console.log(a + b); // error
输出
helloWorld
Uncaught ReferenceError: b is not defined
在上面的程序中,变量a是全局变量,变量b是局部变量。只能在函数 greet内部访问变量b 。因此,当我们尝试在函数外部访问变量b时 ,会发生错误。
let是块范围的
let
关键字是块作用域(只能在立即块中访问变量)。
示例2:块作用域变量
// program showing block-scoped concept
// global variable
let a = 'Hello';
function greet() {
// local variable
let b = 'World';
console.log(a + ' ' + b);
if (b == 'World') {
// block-scoped variable
let c = 'hello';
console.log(a + ' ' + b + ' ' + c);
}
// variable x cannot be accessed here
console.log(a + ' ' + b + ' ' + c);
}
greet();
输出
Hello World
Hello World hello
Uncaught ReferenceError: x is not defined
在上面的程序中,变量
- a是全局变量。可以在程序中的任何位置访问它。
- b是局部变量。只能在
greet
函数内部访问它。 - c是块作用域变量。只能在
if
语句块内访问它。
因此,在以上程序中,前两个console.log()
正常工作。
但是,我们正在尝试在第三个console.log()
中的块外部访问块作用域变量c 。这将引发错误。
注意 :在JavaScript中, var
是函数范围的, let
是块作用域的。如果您尝试使用var c = 'hello';
在上述程序的if
语句内部,整个程序都可以工作,因为c被视为局部变量。
要了解有关let vs var的更多信息,请访问JavaScript let vs var 。