函数声明语法
function sum (num1,num2) {
return num1 + num2;
}
函数表达式
var sum = function (num1,num2) {
return num1 + num2;
};
- 函数名仅仅是指向函数的指针,后面函数会覆盖前面的函数
- 解析器会率先读取函数声明,并使其在执行任何代码前可用;
- 函数表达式,必须等到解析器执行到所在代码行,才会被解释执行。
function sum (num) {
return num + 100;
}
function sum (num) {
return num + 200;
}
sum(1); //201
函数声明
alert(sum(10,10)); //20
function sum (num1,num2) {
return num1 + num2;
}
函数表达式
alert(sum); //undefined
alert(sum(10,10)); //Uncaught TypeError: sum is not a function
var sum = function (num1,num2) {
return num1 + num2;
}
可看作变量提前声明,但未赋值
直到执行到函数所在的语句前,变量sum中不会保存对函数的引用
- 函数声明—>函数体初始化(函数变量=函数体)—>变量声明
函数声明:
重复的声明会被忽略,只剩下赋值操作;
变量声明:(var)重复的声明会被忽略,只剩下赋值操作。let会报错。
- 同个变量名的函数和变量,变量会覆盖函数的赋值操作
console.log(aaa); //ƒ (){}
var aaa = 111; //先声明变量aaa,将函数体赋值给aaa,再将111赋值给aaa
function aaa(){};
console.log(aaa); //111
var aaa = 111;
aaa = function (){}; //此时才将函数体赋值给aaa
console.log(aaa); //ƒ (){}
function test (b) {
b = 2;
console.log('b',b); //2
function b(){};
console.log('b',b); //2
}
test(1);
console.log(a);
var a = 1;
console.log(a);
(function(){
//a变量声明提升至函数内部最顶,所以是undefined
if(typeof a === "undefined"){
var a = '2';
console.log(a,'a');
}else{
console.log(a,'nnnn');
}
})()
控制台依次 undefined
1
2 a