首先,分清楚js中存在两种做用域,即全局做用域和方法做用域
var定义的变量是方法做用域,好比:函数
function() { var str = 'I am var'; console.log(str); // I am var } console.log(str); // undefined
这是在函数中,可是须要注意的是在for循环中的问题:code
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就正好解决了这个问题,它是块级做用域,即{}内能够访问io
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 ReferenceErrorconsole
const和let做用域一致,可是经过const赋值的变量不可再次复制(不是变量自己也不可变,只是不能再次赋值)for循环
const params = { count: 3, price: 10 } params.count = 4 // 正常 params = [] // 报错Uncaught TypeError
变量值会改变用let,不会改变用const(通常都是用来表述常量),尽可能减小用varfunction