1、使用函数模仿块级作用域
function foo (count) {
for(var i = 0; i < count; i++){
console.log(i)
}
console.log(i)//for循环执行完毕后,i依旧存在,值为最终的i++得出的值
}
foo(4)//0 1 2 3 4
2、即使重新声明变量i,其值也不会发生变化
function foo (count) {
for(var i = 0; i < count; i++){
console.log(i)
}
var i//只声明不重新赋值,i值就不变
console.log(i)//i值为4
}
foo(4)//0 1 2 3 4
3、使用立即执行匿名函数模仿块级作用域
function foo (count) {
(function () {//i只在这个作用域有效
for (var i = 0; i < count; i++){
console.log(i)
}
})()
console.log(i)//i变量已被销毁
}
foo(4)//0 1 2 3 Uncaught ReferenceError: i is not defined
- 全局作用域中的函数使用这种方式,可以限制向全局作用域添加过多的变量和函数
- 立即执行函数执行完毕后,其中的变量就立即销毁
番外:理解立即执行函数
1、为一个变量赋值一个方法,然后执行
var i = function () {};
i();
2、现在不使用变量,直接用=后面的方法加一对括号执行
funciton () {} () //出错
3、由于JavaScript将function这个关键字作为一个函数声明的开始,函数声明后面是不能跟圆括号()的;函数表达式后面可以跟圆括号(),因此可以将函数声明外层加一对圆括号,就可以将其转换成函数表达式
(function () {} ) ()