a()
var a = c = function() {
console.log(2)
}
//a is not a function
a()//2
function a(){// 函数声明 脚本在执行之前会做预编译处理
console.log(2)
}
会预编译函数,对于变量,只会分配一个内存空间,不会初始化,初始化过程中会在执行时执行。
var a = c = function() {
console.log(2)
}
a()
function a() {
console.log(1)
}
a();
//2
//2
函数表达式覆盖掉了函数声明。
var a=10;
function fn(a,b){
console.log(a)//function a(){} 这里输出function a(){}, 不是参数a的值,哈哈
var a=10;
console.log(a)//10
function a(){}
console.log(a)//10
}
fn(15);
对于函数而言,形参 < 函数声明,所以,第一个是输出a函数,而不是15
函数预编译相当于把函数放在环境最上方,重新定义a=10,更改了a的值
a();//1
var a = c = function() {
console.log(2)
};
a();//2
function a() {
console.log(1)
}
a();//2
(function(b) {
b();//2 a传递给形参b,
c();//2 自由变量c
var b = c = function a() {
console.log(3)
}//重新定义
b()//3
})(a);//走到这里 a已经被赋值表达式重新赋值
c();//3 自由变量被改变
function fn(){
function a(){console.log(1)}
return a;
function a(){console.log(2)}
}
fn()();//2 由于预编译,2个function提到最前面
网友评论