JavaScript作用域和预解析

2018-11-03  本文已影响0人  AuglyXu

作用域链

 // num属于0级作用域
    var num = 123;
    // test函数也属于0级作用域
    function test() {
        // test的{}中是新开启的一个作用域
        // test的{}中定义的变量和函数都属于1级作用域
        // value属于1级作用域
        var value = 666; // 1级作用域
        // demo函数也属于级作用域
        function demo() {
            // demo的{}中是新开启的一个作用域
            // demo的{}中定义的变量和函数都属于2级作用域
            // temp属于2级作用域
            var temp = 678;
            console.log(temp);
        }
    }

全局变量


预解析

源代码
 var num = 123;
    fun();//undefined
    function fun() {
        console.log(num);
        var num = 666;
    }

预解析之后的代码
var num;
function fun(){
  var num;
  console.log(num)
  num = 666;
}
num = 123;
fun();
源代码
var a = 666;
test();
function test() {
    var b = 777;
    console.log(a);
    console.log(b);
    var a = 888;
}

预解析的代码
var a;
function test() {
    var b;
    var a;
    b = 777;
    console.log(a); // undefined
    console.log(b); // 777
    a = 888;
}
a = 666;
test();

    console.log(value); // function value() {}
    var value = 123;
    function value() {
        console.log("fn value");
    }
    console.log(value); // 123

不同函数定义方式的区别

源代码
if(true){
    // 前面我们说过默认都是0级作用域, 也就是全局作用域
    // 只有定义了函数才会开启一个新的作用域
    // 所以test函数虽然定义在了if的{}中, 但是并没有定义在其它函数中
    // 所以test函数还是属于0级作用域, 所以还是一个全局函数
    function test() {
        console.log("test1");
    }
}else{
    function test() {
        console.log("test2222222");
    }
}
test();

高级别不会提升

低级别浏览器提升后的代码
function test() {
    console.log("test1");
}
function test() {
    console.log("test2222222");
}
if(true){
}else{
}
test();
 if(false){
        var test = function () {
            console.log("test1");
        }
    }else{
        var test = function () {
            console.log("test22222");
        }
    }
    test();

 高级别或者低级别提升后的代码
    var test;
    if(true){
        test = function () {
            console.log("test1");
        }
    }else{
        test = function () {
            console.log("test22222");
        }
    }
    test();
上一篇下一篇

猜你喜欢

热点阅读