基本概念
在当前作用域中,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();