javascript里面的var let const关键字区别和使用
var let const都能定义变量,我们应该怎么取舍呢。
结论:优先使用const 其次是let,最后才是var(尽量避免使用)
一、var 的介绍
作用域范围: 函数级别的作用域
function getAgeVar(){ //这样输出不报错 console.log(age) if(true){ var age = 18; } console.log(age) return age; }
函数级别的作用域:意味着可以在if 条件之外的函数内可以访问到age。
声明提升: 在声明之前可以输出age,不报错。
var 定义的全局变量,会赋值到windows 上。
var x = 10; //通过var 定义的全局变量,能通过window 访问到。 console.log(window.x)
var 还有一个问题就是,同名的变量会一直叠加。
这里就会有一道经典的面试
for(var i = 0; i < 10; i++){ } console.log(i)
可以在循环外输出i,i的值等于10,这个就是变量叠加了。
for(var i = 0; i < 10; i++){ setTimeout(function(){ //这个会因为变量叠加一直输出10,因为是函数级作用域,就是会出现变量叠加。 console.log(i) },0) }
上面这个断面也不会按照我们想的一直输出,0-9。而是直接就输出10次10。也是上面说的变量叠加问题(函数级作用域的影响,导致所有for循环上的i 是共享的。
原因:setTimeout 是异步操作,回调函数会被推入任务队列,但不会立即执行。
主线程会先执行完整个 for 循环(此时 i 已递增到 10),然后才会处理任务队列中的回调。
二、let 的介绍
作用域范围:块级作用域
// Uncaught ReferenceError: age is not defined //console.log(age) if(true){ let age = 18; //因为let 定义的变量,只能在当前作用域中访问到。 } //这样报错: // Uncaught ReferenceError: age is not defined //console.log(age)
没有变量提升,就是作用域在{} 块级作用域里面。
let定义的全局变量 也不会挂载到window 对象上,也不允许变量叠加。
for(let i = 0; i < 10; i++){ //let 每次都会定义一个新的变量。因为这里面有了一个function {}有了一个块,所以每次都是新变量。 setTimeout(function(){ console.log(i) },0) }
这个let会每次都当做一个新的变量,所以上面会按照输出0-9。 因为每个let 变量定义的i 都是块级作用域,也就是在每一次for循环里面单独搞了一个新变量。
三、const 的介绍
作用域范围:块级作用域
const 常量的意思,不能再次修改和赋值。
const message = "Hello, World!"; message = "Hello, JavaScript!"; // 报错:Assignment to constant variable.
const objA={name:'张三',age:18}
objA.name='李四'
objA.age=19
console.log(objA)
对于for 循环,const 是不能用来定义 循环里面的迭代变量的,也就是i++。
但是可以用来定义循环里面不需要迭代的变量。
let i=0; for(const j=7;i<10;i++){ console.log(j); //输出了10次7 }
还可以用在for in或者for of循环中。
const numbers = [1, 2, 3, 4, 5]; //const 是块级作用域,每次都是等于一个新的number变量。 //但是你不能在块级作用域里面修改它,因为就相当于你一次的for循环中,定义了一个const变量,然后你又想重新赋值,这个是不被允许的。 for(const number of numbers){ var tt=number+1; console.log(tt) } const str="hello"; for(const char of str){ console.log(char) }
四、总结
1、优先使用const
2、其次使用let
3、避免使用var

浙公网安备 33010602011771号