js预解释

1.什么是预解释

1) 代码开始执行之前,首先进行全部作用的预解释,把带var和function的变量进行声明clear和定义defined
    var是声明,声明没有赋值默认是==> undefined,不会进行重复的声明,会进行重复的定义,
    function 声明和定义都完成了 ==> 所以可以在函数上面执行, 不会进行重复的声明,会进行重复的定义,
    
2) 作用域:
    全局作用域(window作用域)
    私有作用域(函数作用域) 
        步骤详解:
            --函数执行,新城一个新的私有作用域(开辟内存空间)
            --形参赋值
            --私有作用域里面进行预解释(var, function)
            --代码重上到下执行
            --执行完毕返回
            --外面是否有接收,有的话内存不释放,没有内容释放
3) 变量
    A: 全局变量:
        全局作用域下定义的变量var、function、let、const、class 、import,全局变量都挂在了window对象上,不可以删除(ES6的class和import,let, const除外)
        出现情况:
            1) 全局作用域下定义的
            2)私有作用域里面的给windowd对象挂的属性和方法
            3) 私有作用域内不适用var声明变量,作用域链会增到全局变量
    B: 私有变量:
        函数里面用var和function定义的变量,在外面访问不到
            1) 函数内使用var声明
            2) 形参
        全局作用域访问私有变量: <<闭包>>
        
4) 作用域链
     当函数执行的时候,形参一个新的私有作用域,访问一个变量,看这个变量是否是var或者function声明的,如果是他就是全局变量,如果没有被var,则从他的上一级作用域里面找,如果还没有,则在上级作用域找,知道找到全局作用域window,
     如果是获取的话,会报错 not a defined,如果是设置,则在私有作用域里面设置了一个全局变量
复制代码

2.预解释注意的方法

eg1:

 console.log(x); // => undefined
 console.log(y);  /函数
 
 var x = 1;
 function y() {
 
  
 }
 console.log(x); // 1
 console..og(y); //函数
复制代码

eg2: 无论条件成立,都要进行预解释

    console.log(fn()); //
    function fn() {
        return 1;
    }
    
    if (false) {
        function fn() {
            return 2;
        }
    }
    fn();
复制代码

eg3: 预解释不会重新的声明,但是会重新的定义defined

    var a = 1;
    function a() {
        return 100;
    }
    var a = 2;
    a();
    
    //==>>重复的定义
    fn();
    functon fn() {
        return 1;
    }
    
    fn();
    function fn() {
        return 2;
    }
    fn();
复制代码

eg4: return后面是返回值的,虽然不执行,但是还要进行预解释的

    function fn() {
        console.log(sum());  // ==>  sum is not defined 下面是匿名韩式 报错***
        console.log(a++);
        return function sum() {
            console.log('okk~~~');
        };
        var a = 1;
    }
    fn();
复制代码

eg5: 函数值表达式只对等号前面的进行预解释,后面的不会

    function fn() {
        console.log(a);
        var a = b = c = d = 1;
        console.log(a, b, c, d);
    }
    console.log(a, b, c, d);
    window.a;
    window['a']
    
    fn();
复制代码

eg6:函数之函数表达式,是否提前进行预解释

 fn();  // fn ==> undefined 声明没有定义,默认值是undefined  undefined() 报错了
 var fn = function() {};
 
 fn1();
 function fn1() {
     alert('ok');
 }
复制代码
4.作用域链问题:

eg1:

    console.log(x, y);
    var x = 1;
    var y = 100;
    function fn() {
        console.log(x, y);
        var x = 1;
        y = 20;
        return {
            x, y
        }
    }
    
    fn();
    
    console.log(x, y);
复制代码

eg2:

    var x = 1;
    var fn = function () {
        var y = 2;
        x ++;
        return function fn() {
            return x + y;
        }
    };
    console.log(fn()());
    
复制代码

eg3: 预解释面试题(***)

   var fn = function() {
        //==>>预解释    var a;  // ==>> undefined    undefined ++ ==>  Number(undefined)++ ==> NaN ++ ==> NaN
       console.log(x++);
       return;
       var x = 1;
       
       
       上面代码等价于:
        var x;
        consoel.log(x);
        return;
        x = 1;
   }
   fn(); // ==>> NaN
复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值