首先,分清楚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