JS中没有块作用域的概念,所以下列的代码中的i可以在全局环境中访问,但这样会有一个弊端:污染了全局环境,因为在大型工程中,有可能会导致变量冲突。
for(var i=0;i<5;i++){
console.log(i)
}
但是JS中仍然有一些语句可以实现块作用域的功能:
JS中块作用域效果的实现:
- with
var obj={
a:4,
b:5
};
with(obj){
a=5;
b=4;
}
console.log(obj);
- try/catch
try/catch中的catch分句会创建一个块作用域:
try{
}catch (err){
console.log(err)
}
上述代码中的err只可以在catch分句中访问
- let/const
ES6中加入了两个声明变量的方式,let和const,这两种方式所声明的变量会绑定到所在的任意作用域中,通常是{...}的内部,二者区别:let声明的变量可修改,const不可修改。 - IIFE
立即执行函数也可以达到将变量封装在函数作用域中的作用,防止污染全局环境:
(function () {
for(var i=0;i<5;i++){
console.log(i)
}
})()