共计 975 个字符,预计需要花费 3 分钟才能阅读完成。
首先,分清楚 js 中存在两种作用域,即全局作用域和方法作用域
var
var 定义的变量是方法作用域,比如:
function() { | |
var str = 'I am var'; | |
console.log(str); // I am var | |
} | |
console.log(str); // undefined |
这是在函数中,但是需要注意的是在 for 循环中的问题:
function calcute({price: [2,4,3]}) {var totalPrice = []; | |
for (var i = 0;i < price.length; i++) {var finallyPrice = price[i] * 2; | |
totalPrice.push(finallyPrice); | |
} | |
console.log(i); // 3 | |
console.log(price); // [2,4,3] | |
console.log(finallyPrice); // [4,8,6]; | |
} |
这个函数中都能访问到 i、price、finallyPrice,这是我们不期望的,这就是 var 方法作用域的弊端
let
let 就正好解决了这个问题,它是块级作用域,即 {} 内可以访问
function calcute({price: [2,4,3]}) {let totalPrice = []; | |
for (let i = 0;i < price.length; i++) {let finallyPrice = price[i] * 2; | |
totalPrice.push(finallyPrice); | |
} | |
console.log(i); // i is not defined | |
console.log(price); // [2,4,3] | |
console.log(finallyPrice); // finallyPrice is not defined; | |
} |
还需要注意的是:var 定义的变量在定义之前访问是 undefined,但是 let 定义变量在定义之前访问会报错 Uncaught ReferenceError
const
const 和 let 作用域一致,但是通过 const 赋值的变量不可再次复制(不是变量本身也不可变,只是不能再次赋值)
const params = { | |
count: 3, | |
price: 10 | |
} | |
params.count = 4 // 正常 | |
params = [] // 报错 Uncaught TypeError |
总结
变量值会改变用 let,不会改变用 const(一般都是用来表述常量),尽量减少用 var
正文完
发表至: javascript
2019-07-12