2.全局变量的细节问题和预解释机制

全局变量的细节问题

console.log(num); //undefined
var num = 12;
console.log(num2); //num2 is not defined
num = 12;

 在全局作用域当中,带var和不带var的关系?
        带var的可以进行预解释,所以在赋值的前面执行,不会报错
        而不带var的是不能进行解释的,在前面执行会报错

        var num = 12;
        console.log(num); //12
        首先相当于给全局作用域增加了一个全局变量num,但是不仅如此,也相当于给window增加了
        一个属性名num2,属性值是12

        num2 = 12;
        console.log(num2);//12
        num2=12相当于给window增加了一个叫做num2的属性名,属性值是12

    function fn(){
        console.log(total);  //undefined
        var total = 100;
    }
    fn();
    console.log(total);//undefined
    var total = 0;


    function fn(){
        console.log(total);//0
        total = 100;
    }
    fn();
    console.log(total);//100
    var total = 0;

    私有作用域出现的一个变量不是私有的,则往上级作用域进行查找,上级没有则继续向上查找,
    一直找到window为止,如果window下也没有呢?
    我们是获取值:console.log(total); //报错了
    如果我们是设置值:total =100;相当于给window增加了一个属性名total,属性值是100
    js如果在不进行任何特殊处理的情况下,上面代码报错,下面的代码都不执行了

预解释是一种毫无节操的机制

判断num是否为window这个对象的一个属性,是的话返回true,不是返回false
    var boj = {
        name:'hulongfei',
        age:27
    };
    console.log('name' in obj); //true
    console.log('it' in obj); //false


   预解释的时候不管的条件是否成立,都要把带var的进行提前声明
    if(!("num" in window)){
        var num = 12;
    }
    console.log(num); //undefined
   fn();
    function fn(){
        console.log('ok');
    }
    fn(); 

  匿名函数之函数表达式
    预解释的时候只预解释等号左边的,右边的值,不参与预解释
    window下的预解释:var fn;

    fn(); //fn is not a function 
    var fn = function(){
        console.log('ok');
    }
自执行函数:定义和执行一起完成了
    在全局作用域下不进行预解释,当代码执行到这个位置的时候定义和执行就一起完成了
    (function(num){})(100);
函数体中return下面的代码虽然不再执行了,但是需要进行预解释,return后面跟
    着的都是我们返回的值,所以不进行预解释
    function fn(){
        console.log(num);
        return function(){

        }
        var num = 100;
    }
    fn();
如果在预解释的时候名字已经声明过了,不需要重新声明,但是需要重新的赋值
    在js 中如果变量的名字和函数的名字重复了,也算冲突,
    var fn = 13;
    function fn(){
        console.log("ok");
    }    

    fn();
    function fn(){
        console.log(1);
    }
    fn();
    var fn = 10;
    fn();
    function fn(){
        console.log(2);
    }
    fn();

你可能感兴趣的:(2.全局变量的细节问题和预解释机制)