首先我们来看一段代码,然后通过分析这段代码来说明作用域链的这个问题,代码如下:
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作用域下的执行顺序,如下图:
1 如何区分私有的和全局的?
第一:在全局作用域下声明(预解析)的变量是全局变量。<br>
第二:在私有作用域中生成的变量和函数的形参都是私有变量。
第三:如果在私有作用域中遇到一个变量,如果能判断是私有变量,那么它与外界的任何内容都没有关系。如果不是私有变量,那么则往当前作用域的上一级进行查找,如果上级也没有,一直往上查找,直到window。(其实这个就是作用域链)
2 函数的私有作用域的执行顺序
当函数在执行的时,执行的是函数体内的内容,所以函数首先会形成一个新的私有的作用域。
第一步:函数的有形参,那么就先给形参赋值
第二步:进行私有域中的预解释
第三步:私有域中的代码从上到下的执行
如下图是:函数体执行的顺序:
函数形成一个新的作用域,用来保护里面的私有变量,不受到外界变量的影响,同时也不影响外界变量,这种情况我们叫“闭包”
作用域的预解析对于var变量只是定义但是不会赋值,赋值是在执行的时候进行赋值的
函数里面判断是否是私有的变量,就看是否是形参和前面是否有var声明符号