var arr = []; for(let i=0;i<10;i++) { arr[i]=function(){ console.log(i); } } arr[6]();//輸出6
var arr = []; for(var i=0;i<10;i++) { arr[i]=function(){ console.log(i); } } arr[6](); //var聲明的i是全局變量,所以i=10,輸出10
這種直接動態定義方法並執行的是什么語法規則???
2、
function func(arg) { { let arg; } }
這是什么??代碼塊??什么作用??
3、
var tmp = new Date(); function f() { console.log(tmp); if (false) { let tmp = 'hello world'; } } f(); // undefined //let聲明tmp不會造成變量提升,所以會輸出時間 //let不允許在相同作用域內,重復聲明同一個變量
function f1() { let n = 5; if (true) { let n = 10; } console.log(n); // 5
//上面的函數有兩個代碼塊,都聲明了變量n
,運行后輸出 5。這表示外層代碼塊不受內層代碼塊的影響。如果兩次都使用var
定義變量n
,最后輸出的值才是 10。
}
4、常量聲明const
const
實際上保證的,並不是變量的值不得改動,而是變量指向的那個內存地址所保存的數據不得改動。對於簡單類型的數據(數值、字符串、布爾值),值就保存在變量指向的那個內存地址,因此等同於常量。但對於復合類型的數據(主要是對象和數組),變量指向的內存地址,保存的只是一個指向實際數據的指針,const
只能保證這個指針是固定的(即總是指向另一個固定的地址),至於它指向的數據結構是不是可變的,就完全不能控制了。因此,將一個對象聲明為常量必須非常小心
const foo = {}; // 為 foo 添加一個屬性,可以成功 foo.prop = 123; foo.prop // 123 // 將 foo 指向另一個對象,就會報錯 foo = {}; // TypeError: "foo" is read-only