函数声明和变量声明

88 阅读1分钟

函数声明语法

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