有 3 种定义函数的方式
function
关键字后需要指定函数名
function sum(num1, num2) {
return num1 + num2;
} // 不加分号
console.log(sum(2, 3)); // 5
function
关键字后不用指定函数名;函数末尾需要添加一个分号,就像声明其他变量时一样
var sum = function (num1, num2) {
return num1 + num2;
}; // 加分号
console.log(sum(2, 3)); // 5
Function
构造函数可以接收任意数量的参数,但最后一个参数始终都被看成是函数体,而前面的参数则枚举出了新函数的参数。
var sum = new Function(‘num1‘, ‘num2‘, ‘return num1 + num2‘); // 不推荐
console.log(sum(2, 3)); // 5
??函数声明 与 函数表达式 是有区别的。执行代码时,解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问);至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解释执行。
??同时说明:函数声明会被提升;函数声明要早于变量声明被解析器读取;
// 函数声明提升
console.log(sum(2, 3)); // 5 (函数声明被提升到源代码树顶部)
function sum(sum1, sum2) {
return sum1 + sum2;
}
如果把上面的函数声明改为等价的函数表达式,执行将报错:
console.log(sum(2, 3)); // TypeError: sum is not a function
var sum = function (sum1, sum2) {
return sum1 + sum2;
}
Function
类型的实例,而且都与其他引用类型一样具有属性和方法。function sum(num1, num2) {
return num1 + num2;
}
console.log(sum(2, 3)); // 5
var anotherSum = sum; // 使用 不带圆括号 的函数名是访问函数指针,而非调用函数
console.log(anotherSum(2, 3)); // 5
// 以下为关键代码
sum = null;
console.log(anotherSum(2, 3)); // 5
可以结合以下例子理解
var obj1 = new Object();
var obj2 = obj1;
obj1.name = ‘Nicholas‘;
console.log(obj2.name); // Nicholas
obj1 = null;
console.log(obj2.name); // Nicholas
原文:https://www.cnblogs.com/uakora/p/12694876.html