






















var let const都能定义变量,我们应该怎么取舍呢。
结论:优先使用const 其次是let,最后才是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),然后才会处理任务队列中的回调。
作用域范围:块级作用域
// 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 message = "Hello, World!"; message = "Hello, JavaScript!"; // 报错:Assignment to constant variable.
const 声明只是声明了一个变量的引用, 是可以改变里面的属性的值的。这个针对对象来说的,const定义的对象是可以修改的
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) }
const。这样可以提高代码的可读性和可维护性,让其他开发者一眼就能看出该变量是常量,避免意外的修改。const 还能减少代码中的错误,因为 JavaScript 引擎会阻止对常量的重新赋值操作。let。由于 let 具有块级作用域,能有效避免变量泄漏问题,让代码的作用域更加清晰。var 的函数作用域和变量提升特性,容易导致变量泄漏和意外的变量覆盖问题,使得代码的行为难以预测。在现代 JavaScript 开发中,除非有特殊需求,否则应尽量避免使用 var。此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。