var
1.var表示声明了一个变量,并且可以同时初始化该变量.
2.使用var语句声明的变量的作用域是当前执行位置的上下文:一个函数的内部(声明在函数内)或者全局(声明在函数外).
给一个非声明变量赋值会隐式创建一个全局变量(造成代码污染)(全局object的一个属性).
-
声明变量(DeclaredVariable)和非声明变量(Undeclared Variable)的区别是:
- 声明变量的作用域限制在其声明位置的上下文中,而非声明变量总是全局的.
- 声明变量在任何代码执行前创建,而非声明变量只有在执行赋值操作的时候才会被创建.
- 声明变量是它所在上下文环境的不可配置属性(non-configurable property),非声明变量是可配置的(例如非声明变量可以被删除).
强烈建议必须使用声明变量!!!(无论是否在函数内) - 变量提升:由于变量声明(以及其他声明)总是在任意代码执行之前处理的,所以在代码中的任意位置声明变量总是等效于在代码开头声明.这意味着变量可以在声明之前使用
let
-
let声明了一个块级域的局部变量,并且可以给它一个初始化值.
-
let允许把变量的作用域限制在块级域中.与var不同处是:var声明变量要么是全局的,要么是函数级的,而无法是块级的.
-
let声明的变量作用域包含定义它的块以及任何包含的子块中.这点和var相似.
-
在同一个函数或同一个作用域中用let重复定义一个变量将引起TypeError.
-
let的作用域是块,而var的作用域是函数.
-
let块提供了一种在块的范围内获取变量的值,而不会影响块外面名字相同的变量的值的方法.
const
- const声明创建一个只读的常量.这不意味着常量指向的值不可变,而是变量标志符的值只能赋值一次.(注意区分常量的值和常量指向的值不同)
注意:这点与java C++中类似.即:指向常量的指针,表示这个指针不能改变所指向变量的值,仅表示"只读".但是被指向的变量的值可以通过其他手段改变.
-
可以在全局作用域或者函数内声明常量,常量需要被初始化.
-
常量拥有块作用域,和使用let定义的变量十分相似.常量的值不能通过再赋值改变,也不能再次声明.
-
一个常量不能和它所在相同作用域内的其他变量或函数拥有相同的名称.
-
常量可以是一个具体的值,也可以是一个对象.注意:常量是对象时,对象内部的属性可变而不受保护.
例如:
const myObject={"key":"value"};
myObject={"newKey":"newValue"};//这句会报错
myObject.key="newValue";//这句则会成功