JS变量中有var定义和无var定义的区别
在Javascript中,有使用var
定义变量和不使用var
直接定义变量两种方式。
1. 使用var定义变量
使用var
定义的变量会存在变量提升,即在变量声明之前,该变量也可以被访问到。这种定义方式的变量作用域是该变量所在的函数作用域(如果在函数内定义)或全局作用域(如果在函数外定义)。
示例1:使用var定义变量
function foo() {
var x = 1;
if (true) {
var x = 2;
console.log(x); // 输出2
}
console.log(x); // 输出2
}
在示例1中,函数foo
中定义了一个变量x
并赋值1,紧接着在if语句块中又定义一个变量x
并赋值2,打印输出结果是2。在if语句块外部再次打印输出结果也是2。这是由于var
定义的变量作用域是函数作用域,if语句块并不会影响变量的作用域范围。
2. 不使用var直接定义变量
如果直接使用一些变量(不使用var
)在代码中引用,那么这些变量的作用域就是全局,而不论这些变量在哪个函数中,也无法避免变量名的冲突。这种直接定义方式被视为一种很不好的代码实践,不应推荐使用。
示例2:使用全局变量
function foo() {
x = 1;
}
foo();
console.log(x); // 输出1
在这个示例中,函数内部直接对x进行赋值,但没有使用var来定义变量,最终结果变量x变成了全局变量,并可以在函数外部进行访问。
ES6
中let命令和const命令
ES6
新增了两种变量的声明方式:let
和const
。
let
命令let
命令声明的变量只在其所在代码块中生效,不存在变量提升现象。在同一作用域内,不允许重复定义。
示例3:使用let声明的变量
function foo() {
let x = 1;
if (true) {
let x = 2;
console.log(x); // 输出2
}
console.log(x); // 输出1
}
在示例3中,使用let
命令定义的变量x
只在当前代码块中有效。if语句块中重新定义了一个x
变量,不会影响函数作用域内的x
变量。
const
命令const
命令用于定义常量,其值在定义后不可被修改,一般用于定义不会被修改的常量或对象。
示例4:使用const声明的常量
const PI = 3.1415926;
PI = 3.14; // 报错 Assignment to constant variable.
console.log(PI);
在示例4中,常量PI
被赋值为3.1415926,一旦定义后,其值不可被修改。如果修改PI
的值会报错:“Assignment to constant variable.”
综上所述,使用var
定义变量会存在变量提升,作用域是函数作用域或全局作用域;而使用let
和const
声明的变量在定义位置形成块级作用域,不存在变量提升,不允许重复定义,const
声明的变量是常量,其值不可以被修改。