fun()
var fun=function(){} //报错
//等价于
var fun
fun()
fun=function(){}
javaScript的执行过程先扫描整体语法语句,如果存在逻辑错误或者语法错误,那么直接报错,程序停止执行,没有报错的,开始从上到下解释一行执行一行。
预编译
预编译代码执行前的操作,会变量提升、函数提升(具名函数)
变量提升会提升变量声明,不会提升变量赋值,一般是针对var声明的变量
局部变量
1.声明变量,形参和变量声明
2.实参值赋值给形参
3.函数声明,赋值
4.执行函数
function test(a){ //声明形参a:undfined,形参赋值a:undfined->a:1
console.log(a); //1
var a=3; //声明赋值 a:1->a:3
console.log(a);//3
}
test(1) //函数执行
function test(a){ //声明形参a:undefined,形参赋值a:undefined->a:1
console.log(a); //function a(){},函数提升a:1->function a(){}
function a(){}
a=5; //变量赋值a:function->a:5
console.log(a); //5
}
test(1) //执行函数
function test(a){ //声明形参a:undefined,形参赋值a:undefined->a:1
console.log(a); //function a(){},函数a函数提升a:1->a:function a(){}
var a=1; //变量赋值 a:function(){}-> a:1
console.log(a); //1
function a(){};
console.log(a); //1
var b=function(){};//b:undefined->function(){}
console.log(b); //function(){}
function d(){} // d:function d(){}
}
test(2) //执行函数
function test(a,b){ //声明形参a:undefined,形参赋值a:undefined->a:1,声明形参b:undefined
console.log(a); //1
c=0;
var c;
a=5;
b=6; //变量赋值function b(){}->6
console.log(b); //6
function b(){}; //函数提升
function d(){};
console.log(b); //6
}
test(1) //执行函数
//a:undefined->1->5
//b:undefined->function b(){}->6
//c:undefined->0
//d:function d(){}
全局变量
1.找变量
2.找函数声明
3.执行
var a=1;
function a(){
console.log(2);
}
console.log(a); //1
//a:undefined->function a(){}->1
等同于
var a
function a(){
console.log(2);
}
a=1
console.log(a); //1
console.log(a,b); //function a(){} undefined
function a(){}
var b=function(){}
//b:undefined->function(){}
//a:undefined->function a(){}
//等同于
var b
function a(){}
console.log(a,b); //function a(){} undefined
b=function(){}
var foo = "Hello";
(function(){
var bar = " World";
console.log(foo + bar); //Hello World
})();
console.log(foo + bar);//报错
全局:foo:undefined->hello
function(){}
局部:bar:undefined->world
compute(10,100);
var compute = function(A,B) {
console.info(A * B) ; //20
};
function compute(A,B){
console.info(A + B);
}
function compute(A,B){
console.info((A + B)*2); //220
}
compute(2,10);
//compute:undefined->function(){A+B}->function(){(A+B)*2}->执行compute(10,100)->function(){a*B}->compute(2,10)
//等同于
var compute
function compute(A,B){
console.info(A + B);
}
function compute(A,B){
console.info((A + B)*2);
}
compute(10,100); //220
compute = function(A,B) {
console.info(A * B) ;
};
compute(2,10); //20
var b=3;
console.log(a); //function a(){}外
function a(a){
console.log(a); //function a(){}内
var a=2;
console.log(a); //2
function a(){
var b=5;
console.log(b);//5
}
}
a(1)
//全局 b:undefined->3
// a:function a(){}
//局部 a:undefined->1->function a(){}->2
// b:undefined->5
//等同于
var b
b=3
function a(a){
var a //a:undefined->1
function a(){
var b
b=5;
console.log(b);//5
}
console.log(a); //function a(){}内
a=2;
console.log(a); //2
}
console.log(a); //function a(){}外
a(1)
a=1;
function test(){
console.log(a); //undefined
a=2;
console.log(a);//2
var a=3;
console.log(a);//3
}
test();
var a;
//全局:a:undefined->1
//局部:a:undefined->2->3
function test(){
console.log(b); //undefined
if(a){
var b=2;
}
c=3;
console.log(c); //3
}
var a;
test();
a=1;
console.log(a); //1
//全局:a:undefined->1
// test:function test(){}
// c:undefined->3
//局部:b:undefined (if语句预编译影响)
a=1 ;
function test(e){
function e(){}
arguments[0]=2;
console.log(e); //2
if(a){
var b=3;
}
var c;
a=4;
var a;
console.log(b); //undefined
f=5;
console.log(c); //undefined
console.log(a); //4
}
var a;
test(1);
console.log(a); //1
console.log(f); //5
全局:a:undefined->1
test:function test(){}
f:undefined->5
局部:e:undefined->function e(){}->2
b:undefined
c:undefined
a:undefined->4
var a = 1;
function fn(){
console.log(a); //undefined
var a = 5;
console.log(a); //5
a++;
var a;
fn2();
console.log(a); //20
function fn2(){
console.log(a); //6
a = 20;
b = 100;
}
}
fn();
console.log(a); //1
a = 10;
console.log(a); //10
console.log(b); //100
全局:a:undefined->1->10
b:undefined->100
局部:a:undefined->5->6->20