1. 预编译规则
- js在页面加载过程中顺序执行。但是分块预编译、执行。
- js在执行前会进行类似"预编译"的操作,而且先编译预声明变量再编译预定义函数。
特别注意,是声明,不是定义,如:var a = 1; 在预编译中,只是执行了"var a"没有赋值,即在预编译结束时a 为undefined。 - 并不是先全文编译完再执行,而是块编译,即一个script块中预编译完就执行,然后(按顺序)下一个script块,预编译后再执行,但此时在上一个块中的数据都是可以用的,但下一个块中的函数,声明的变量都是不可用的。
- 变量没声明就引用,会报错,但对象方法,对象变量如果没有声明,值是undefined。
- 在函数中变量不声明就赋值,会被认为是全局变量,用var声明后为函数变量(局部变量)。
- 在执行函数时也是先编译后执行,但要注意在函数定义中(即大括号中)的代码即使有错只要函数不执行,就不会有影响,但一执行函数,开始函数预编译就会出错。
2. 示例
fn();
alert(b);
function fn(){
var a=b=100;
}
console.log(a);
var a=function fn(){var a=b=100;}
a();
console.log(a);
console.log(b);
function bar(){
return foo;
foo=100;
function foo(){}
var foo=11;
}
console.log(bar());
console.log(bar());
function bar(){
foo=10;
function foo(){}
var foo=11;
return foo;
}
- 示例4
同时使用函数声明、函数表达式定义函数,其位置不同会导致输出结果不同。
请看这篇博客