javascript是一门解释性语言,自然没有编译过程,但在脚本执行之前会有语法检查和执行环境的构建,我们把这一过程姑且称为预处理吧。
一、函数声明,javaScript解析器把函数提升
fn(); //output 2
var fn= function(){
console.log(1);
}
function fn(){
console.log(2);
}
fn(); //output 1
首先,后面的fn()函数声明提前,所以第一个fn() 为2
其次,后面定义的fn()覆盖前面声明的函数,所以后面执行的函数为字面两定义的函数,结果为1
函数定义、函数声明、arguments三者优先级?
function fn(t){
t(); @1 var t
function t(){ @2.var t=function(){console.log(1)}
console.log(2); @3.var t=function(){consol.log(2)};
} @4.t();
var t = function(){
console.log(3);
}
console.log(t);
}
fn(function(){console.log(1)}); //output 2
//output function(){console.log(3);}
@1.变量声明var t提升到最顶端
@2.arguments中变量首先会覆盖var方式声明的变量(变量声明提升)
@3.函数声明覆盖相同名字的变量
优先级:函数形参>函数声明>变量声明(当变量声明遇到已经有同名的时候,不会影响已经存在的属性)
函数形参---->由名称和对应值组成的一个变量对象被创建,如果没有传递对应参数的话,那么由名称和undefined值组成的一种变量对象的属性也被创建
函数声明---->由名称和对应值(函数对象)组成的一个变量对象的属性被创建,如果变量对象已经存在相同的名称属性,则完全替换这个属性
变量声明---->由名称和对应值(undefined)组成一个变量对象的属性被创建,如果变量名称跟已经声明的形式参数或函数相同,则变量声明不会干扰已经存在的对象
function aa(a,b,c){ @1.a=1 b=2 c=3 @2.a=function a(){} @3.var a; var aa变量声明提升
function a(){}
console.log(a);
console.log(aa);
console.log(arguments);
var a='ee';
var aa='444';
arguments=6;
console.log(a);
console.log(aa);
console.log(arguments);
}
aa(1,2,3);
输出结果:
function a(){}
undefined
[function, 2, 3]
ee
444
6