在塊級作用域中使用var
聲明變量,外面同級的塊級作用域也可以訪問。if、switch、for 等語句的作用域都沒有塊級作用域,所以說,在這些語句中聲明的變量都能被外界訪問,這是非常不安全的。
創(chuàng)新互聯(lián)公司是一家專注于成都做網(wǎng)站、成都網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)與策劃設(shè)計,山丹網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:山丹等地區(qū)。山丹做網(wǎng)站價格咨詢:18982081108
function f() {
if (true) { var x = 10; }
console.log(x); // => 10
}
在 if 語句中通過var
定義的變量,能夠被外界訪問。然而,在 Java 中是不允許的:
而 JavaScript 只有函數(shù)才能創(chuàng)建一個塊級作用域,也可以用IIFE
函數(shù)來創(chuàng)建一個塊級作用域。
function f() {
(function () { if (true) { var x = 10; } })();
console.log(x); // => Uncaught ReferenceError: x is not defined
}
用IIFE
函數(shù)創(chuàng)建塊級作用域,if 語句在里面聲明變量,在第 3 行中使用變量 x,報錯了。
控制語句、條件語句的作用域不是塊級作用域,所以var
聲明的變量可以穿透,導(dǎo)致變量沖突容易發(fā)生。ES6 新出的let
和const
關(guān)鍵字聲明在這些語句中就能形成塊級作用域。所以,我推薦使用let
來聲明變量,而不是var
。
function fun() {
for (let i = 10; i > 0; i--) {}
console.log(i); // => Uncaught ReferenceError: i is not defined
}