js的作用域分为全局作用域与函数作用域、但是在es6之前js没有块级作用域因此
for(var i =0;i<10;i++){
}
console.log(i)
输出的是10
实现跨级作用域的方法例如(IIFE)立即调用函数表达式。在闭包中经常看见
例
(function(){
for(var i =0;i<10;i++){
}
})()
console.log(i)
如果在申明变量时没有使用var关键字呢么默认为全局变量,只要函数内定义了一个局部变量,函数在解析的时候都会将这个变量“提前声明”:例
<script>
var scope = "global";
function fn(){
console.log(scope);//result:undefined
var scope = "local";
console.log(scope);//result:local;
}
fn();
</script>
在浏览器环境编译时上面的代码会被自动编译为
var scope = "global";
function fn(){
var scope;//提前声明了局部变量
console.log(scope);//result:undefined
scope = "local";
console.log(scope);//result:local;
}
fn();
作用域链 在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问。
function outer(){
var scope = "outer";
function inner(){
return scope;
}
return inner;
}
var fn = outer();
fn();
outer()内部返回了一个inner函数,当调用outer时,inner函数的作用域链就已经被初始化了(复制父函数的作用域链,再在前端插入自己的活动对象),具体如下图: 

被折叠的 条评论
为什么被折叠?



