阅读 46

javascript作用域链

首先我们来看一段代码,然后通过分析这段代码来说明作用域链的这个问题,代码如下:

console.log(total);
		var total=0;
		function fn(num1,num2){
			console.log(total);
			var total=num1+num2;
			console.log(total);
		}
		fn(100,200)
		console.log(total);
复制代码

这段代码输出的结果为:

undefined
undefined
300
0

window作用域下的执行顺序,如下图:

window作用域下的

1 如何区分私有的和全局的?

第一:在全局作用域下声明(预解析)的变量是全局变量。<br>
第二:在私有作用域中生成的变量和函数的形参都是私有变量。
第三:如果在私有作用域中遇到一个变量,如果能判断是私有变量,那么它与外界的任何内容都没有关系。如果不是私有变量,那么则往当前作用域的上一级进行查找,如果上级也没有,一直往上查找,直到window。(其实这个就是作用域链)
复制代码

2 函数的私有作用域的执行顺序

当函数在执行的时,执行的是函数体内的内容,所以函数首先会形成一个新的私有的作用域。

第一步:函数的有形参,那么就先给形参赋值
第二步:进行私有域中的预解释
第三步:私有域中的代码从上到下的执行
如下图是:函数体执行的顺序:
复制代码

函数形成一个新的作用域,用来保护里面的私有变量,不受到外界变量的影响,同时也不影响外界变量,这种情况我们叫“闭包”

作用域的预解析对于var变量只是定义但是不会赋值,赋值是在执行的时候进行赋值的

函数里面判断是否是私有的变量,就看是否是形参和前面是否有var声明符号