JS中函数的作用域及作用域链,预解析

全局变量:在函数以外用var声明的变量在全局都可以使用,就是全局 变量.

*如果页面不关闭,那么就不会释放,就会占内存,消耗内存

局部变量:在函数内部定义的变量是局部变量,只能在函数内部使用,外部不能使用

*当函数调用完毕,局部变量就释放了

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

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

隐式全局变量:变量声明没有var,就叫隐式全局变量

function f1(){
    number = 100;//是隐式全局变量
}
f1();
console.log(number);//此时打印的结果是100

*注意:全部变量是不能被删除的,但是隐式全局变量是能被删除的
var num1 = 1;
num2 = 2;
delete num1;
delete num2;
console.log(num1);//number
console.log(num1+2);//3
console.log(num2);//undefined
作用域链
var num = 10;
function f1(){
    var num = 20;
    function f2(){
        var num = 30;
       function f3(){
           var num = 40;
           console.log(num);
       }
       f3();
    }
    f2();
}
f1();//结果为40
**如果f3中没有num就会到f2中去寻找num,找到后打印f2中的值,如果没有到f1中寻找num,如果有打印f1的num值,如果没有再到全局中寻找num,找到打印num的值,如果在找不到,就报错
预解析

在解析代码之前,把变量的声明和函数的声明提前到当前所在的作用域的最上面

f1();
function f1(){
    console.log("函数的预解析");
}

上面的代码把函数提前声明了,所以f1调用的时候不会报错

案例1:
f1();
function f1(){
    console.log(num);
    var num = 10;
}
上面的代码相当于:
function f1(){
    var num;//undefined,因为只定义了还没赋值就调用了,所以结果是undefined,如果没有预解析,就会报错
    console.log(num);
    num = 10;
}
f1();
案例2:
f1();//此函数调用的结果是undefined
var num = 20;
function f1(){
    console.log(num);
    var num = 10;
}

//上面函数代码就相当于
var num = 20;
function f1(){
    var num ;
    console.log(num);//在函数内部找到num后就不会出函数再去找
    num = 10;
}

案例3:
var a;
a = 18;
f1();
function f1(){
    var b = 9;
    console.log(a);//udefined
    console.log(b);//9
    var a = '123';
}
案例4:
f1();
console.log(c);//9
console.log(b);//9
console.log(a);//报错
function f1(){
    var a = b = c = 9;
    console.log(c);//9
    console.log(b);//9
    console.log(a);//9
}
//以上代码就相当于:
function f1(){
    var a;
    a = 9;  //局部变量
    b = 9;  //隐式全局变量
    c = 9;  //隐式全局变量
    console.log(c);//9
    console.log(b);//9
    console.log(a);//9
}
f1();
console.log(c);//9
console.log(b);//9
console.log(a);//报错 

函数声明预解析


f1();   //报错
var f1 = function (){
    console.log(a);
    var a = 10;
}
解释:因为在调用的时候只声明了一个变量,并没有说明是不是一个函数,直接函数调用就报错了。
var f1;
f1();
f1 = function(){
    var a ;
    console.log(a);
    a = 10;
}

猜你喜欢

转载自blog.csdn.net/admin_ccc/article/details/80878094