javascript作用域、预解析笔记

    1、作用域

    一般情况下,一段代码中所用到的名字并不总是有效可用的,
    而限定这个名字(变量)的可用性的代码范围就是这个名字的作用域,可用有效的减少变量名冲突
    2、js的作用域(es6)之前:全局作用域,局部作用域
    3、全局作用域:整个script标签 或者是单独的JS文件
    4、局部作用域(函数作用域),在函数内部就是局部作用域,这个变量名只能在函数内部使用
    5、变量作用域
    根据作用域的不同,变量分为全局变量,局部变量

    注意

    如果在函数内部没有声明直接赋值的变量也叫全局变量
    函数的形参也是局部变量
    全局变量:只有浏览器关闭的时候才会销毁,比较占内存
    局部变量:当程序执行完毕就会销毁,比较节约内存

    6、现阶段JS没有块级作用域
    在es6中有块级作用域
    块级作用域 {} if{} for{}

    7、作用域链
    内部函数访问外部函数 采用的就是链试这种结果就是作用域链 (就近原则)


    预解析

    先预解析 然后执行代码
    JS引擎会把var和function全部提到当前作用域的最前面然后按照代码的顺序从上往下执行
    预解析分为 变量预解析 和 函数预解析
    变量提升~~~~~~ 变量声明提升到当前作用域的最前面 不提升赋值操作
    函数提升~~~~~~ 函数声明提升到当前作用域的最前面 不调用函数
    函数表达式函数的调用必须写在函数表达式函数的下面

 1     // 局部变量
 2     function fn() {
 3         var num = 9;
 4         console.log(num);
 5     }
 6     fn()
 7 
 8 
 9     // 作用域链
10     var num = 7;
11 
12     function fn1() { // 外部函数
13         var num = 3;
14 
15         function fn2() { // 内部函数    内部函数可以访问外部函数
16             console.log(num);
17             var sum = 4;
18         }
19         fn2()
20     }
21     fn1()
22 
23 
24 
25     console.log(num1); //坑1
26     var num1 = 80
27 
28 
29     fun() //坑2
30     var fun = function () {
31         console.log(66);
32 
33     }
34 
35     // 经典预解析案例
36     f1()
37     console.log(c);
38     console.log(b);
39     console.log(a);
40 
41     function f1() {
42         var a = b = c = 9;
43         // 相当于var a=9;b=9;c=9   b,c 没有声明直接赋值就是全局变量
44         console.log(a);
45         console.log(b);
46         console.log(c);
47     }
48     // 99999 a is not defined


 

猜你喜欢

转载自www.cnblogs.com/xf2764/p/12564666.html