js_作用域和作用域链

javascript作用域和作用域链

作用域:函数的使用范围。

变量的讲解:

全局变量:声明的变量是用var声明的,那么这个变量就是全局变量,全局变量可以在页面的任意位置使用;如果页面不关闭,那么就不会释放,就会占空间,消耗内存;全局变量是不能被删除的
局部变量:在函数内部定义的变量是局部变量,外面的不能使用

全局作用域:全局变量的使用范围

局部作用域:局部变量的使用范围

块级作用域:在一对大括号内,可以看成一块,在这块区域中定义的变量,只能在这个区域中使用,但是在js中并没有块级作用域,即在这个块级作用域中定义的变量,在括号外面可以访问。

扩展:

隐式全局变量:声明的变量没有var,隐式全局变量是可以被删除的。
定义变量使用var是不会被删除的,没有var是可以删除的。所以以后要写var。

块级作用域代码

1、

1
2
3
4
{
var num=10;
console.log(num);//10
}console.log(num);//10

2、

1
2
3
if(true){
var num=10;
}console.log(num);//10

3、

1
2
3
4
for(i=0;i<=5;i++){
nu=20;
}
console.log(nu);//20

4、隐式全局变量

1
2
3
4
5
function f1(){
number =1000;//隐式全局变量
}
f1();//调用函数
console.log(number);//1000,可以访问到number的值

隐式全局变量:声明的变量没有var,隐式全局变量是可以被删除的。

定义变量使用var是不会被删除的,没有var是可以删除的。所以以后要写var。

1
2
3
4
5
6
7
var num1=10;
num2=20;
delete num1;//这样不能删除num1
delete num2;//把num2删除了
console.log(typeof num1);//number
console.log(num1);//10
console.log(typeof num2);//undefined ------> num2成功的被删除了,

作用域链

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var num=10;//全局变量
function f1(){
var num=20;//局部变量
function f2(){
var num=30;
function f3(){
var num=50;
console.log(num);
}
f3();//f3()的调用在f2函数里面
}
f2();//f2函数的调用在f1里面
}
f1();//f1()在所有函数的最外面调用
//最后的结果是50,,这种定义函数的方式,现在少见,以后会用到

下面是图解: