作用域的简述:在一段程序代码中用的名字(变量)并不是总是有效的和可用的,而通过限定这个名字的作用范围就是作用域。在JS中作用域又分为:全局作用域 ,局部作用域。
<script>
//整个<script>标签就是全局作用域
var num = 1;//这个num是全局有效的
console.log(num);
function fn() {
var num = 10;//(在函数里面的就是局部作用域)这个num是局部作用域,虽然变量名一样了,在不同作用域下是不会影响的,
console.log(num);
}
fn();
</script>
运行截图:
当然根据作用域的不同,变量也不同,就有了全局变量和局部变量。 如上图代码,在全局作用域下声明的变量为全局变量,在函数内部声明的变量为局部变量。另外函数的形参也是一个局部变量。注意:还有一种特殊情况,如果在函数内部是没有声明,直接进行赋值的变量也是全局变量。从执行效率来看,局部变量 > 全局变量。因为局部变量只有当浏览器关闭是才会销毁,比较占内存资源,而局部变量是当这个函数执行完毕时便会自动销毁。
作用域链简述:通俗的解释就是一个函数要调用这个值,而自己没有,则会向上一级去获取,上一级没有则继续往上,如果都没有的话,则会出现is not defined。
作用域链案例1:num输出的值是多少?
<script>
function fn1() {
var num = 12;
function fn2() {
console.log(num);
}
fn2();
}
var num = 34;
fn1();
</script>
运行截图:
作用域链案例2:num1,num2输出的值是多少?
<script>
function fn1() {
var num2 = 4;
function fn2() {
var num1 = 5;
var num2 = 123;
function fn3() {
var num1 = 12;
console.log (num1,num2);
}
fn3();
}
fn2();
}
fn1();
</script>
运行截图: