作用域链(一层层向上查找,直到没找到宣布失败)
#作用域链
<script>
var num = 10;
function f1(){
var num = 20 ;
function f2(){
var num = 30;
console.log(num); //30
}
f2();
}
f1();
f2();//报错,因为函数执行完后f2的函数体被注销了
</script>
#作用域链
<script>
var num = 10;
function f1(){
var num = 20 ;
function f2(){
//var num = 30;
console.log(num); //20
}
f2();
}
f1();
</script>
域解析
域解析:就是在解析代码之前
1 把变量的声明提前了。
function f1(){
console.log(num); //undefined
var num = 10 ;
}
f1();
事实上这段代码等价于
function f1(){
var num;
console.log(num); //undefined
num = 10 ;
}
f1();
2 函数的声明提前了
<script>
f1();
function f1(){
var num = 20 ;
console.log(num); //20
}
</script>
等价于
<script>
function f1(){
var num = 10 ;
console.log(num); //10
}
f1();
</script>
3 域解析会分段(多对的script标签中函数重名,域解析的时候不会冲突)
<script>
console.log(num); //报错
</script>
<script>
console.log(num); //undefined
var num = 20;
</script>
其他参考
<script>
alert(num); //undefined
var num = 10;
alert(num); //10
</script>
<script>
console.log(num); //num函数体
function num(){
console.log('aaa');
}
var num = 10;
alert(num); //10
</script>
<script>
f1(); // 不能调用报错
var f1=function(){
console.log('aaaa');
}
</script>
其实等价于
<script>
var f1;
f1(); // 不能调用报错
f1=function(){
console.log('aaaa');
}
</script>