预解释(变量提升)

基本概念

在当前作用域中,js代码执行之前,浏览器首先会默认把所有带var和function关键字的及进行提前声明或者定义;

  • 理解声明和定义

     var num = 12;

     申明:var num;

     定义: num= 12

  • 对于带var和function关键字的预解释操作是不一样的

     var:在预解释的时候只是提前声明

     function:在预解释的时候提前声明+定义都完成了

  • 预解释只发生在当前作用域下,例如:开始时只对window下的进行预解释,只有函数执行的时候才会对函数中进行预解释
var num = 1;
var obj = {name:'hxh'}
function fn(){
    var a = 1;
    var b = 2;
}

 上述代码预解释包括如下:

// var num;var obj;fn = xxxfff000;

// fn中的变量a和b在window下不进行预解释,因为它在内存中是以字符串形式执行的,只有执行 fn函数的时候才会进行预解释

  • 预解释的时候,不管条件是否成立都会把带var的变量提前声明(注意这里只是带var的变量,并不包括function)
if(!('num' in window)){
    var num = 12
}
console.log(num) //undefined
  • 预解释时只预解释“=”左边的,“=”右边的是值,不参与预解释
//预解释:var fn;
fn();//TypeError: fn is not a function
var fn = function(){
    
}
  • 自执行函数不进行预解释,当代码执行到这里时定义和执行一起进行
  • return下面的代码虽然不执行了,但是还是需要预解释,return后面跟的是一个返回值,所以不进行预解释
function f(){
        console.log(num);//undefined
        return function(){

        }
        var num = 100;
}
  • 在预解释的时候,如果名字已经声明过了,就不需要重新声明,而是重新的赋值;在js中如果变量和函数重名也算冲突
fn();//2
function fn() { console.log(1) }
fn();//2
var fn = 10;//此处不会进行预解释,只会在执行时重新赋值
fn();//fn is not a function
function fn() { console.log(2) }
fn();

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值