{
var func;
if (true) {
var name = 'why';
func = function () {
console.log(name);
}
// func()
}
name = 'what'
//在中間可以修改name的值
//ES5的缺陷
func()
// if 的塊級作用域必須要借助function
}
在下面代碼的第 10 行中的var i = 1,在所有地方的i都會指派為 1,無論在括号内還是括号外都是 1
{
// for塊級作用域必須要借用function
var btns = document.getElementsByTagName('button')
// for(var i = 0; i <btns.length;i++){
// btns[i].addEventListener('click',function(){
// console.log('第'+i +'個按鈕被點選');
// })
// }
for (var i = 0; i < btns.length; i++) {
(function (num) {
btns[i].addEventListener('click', function () {
console.log('第' + num + '個按鈕被點選');
})
})(i)
//而閉包可以實作,因為函數自己有自己的作用域,不會受外面的影響,隻找屬于自己的i
}
}
{
console.log('-------ES6定義的let有塊級作用域');
let btns = document.getElementsByTagName('button');
for (let i = 0; i < btns.length; i++) {
btns[i].addEventListener('click', function () {
console.log('第' + i + '個按鈕被點選');
})
}
}
var和let的使用的範例
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6]()
輸出10
若将var改成let
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6]()
輸出6
for (let f = 0; f < 3; f++) {
let f = 'abc';
console.log(f);
}
function fn() {
var a = 1;
var a = 2;
}
{
var fn = [];
for (let i = 0; i < 5; i++) {
fn[i] = function (x) {
return x * i;
};
}
console.log(fn[2](10));
}