Function类型 - javascript高级程序设计读书笔记
函数是对象,函数名是指向函数对象的指针。
函数的定义
- 函数声明
function sum (){
return sum1 + sum2;
}
- 函数表达式:
var sum = function(){
return sum1 + sum2;
}; // 末尾有分号,像声明变量一样
先定义变量sum,再将它初始化为一个函数。
[引]由于函数名仅仅是指向函数的指针,因此函数名与包含对象指针的其他变量没有什么不同。换句话说,一个函数可能会有多个名字。
- new Function
var sum = new Function("num1", "num2", "return num1 + num2"); // 不推荐
[引]从技术角度讲,这是一个函数表达式。但是,我们不推荐读者使用这种方法定义函数,因为这种语法会导致解析两次代码(第一次是解析常规 ECMAScript代码,第二次是解析传入构造函数中的字符串),从而影响性能。不过,这种语法对于理解“函数是对象,函数名是指针”的概念倒是非常直观的。
函数声明会在所有代码执行之前执行,就算你的声明代码写在最后一行,也会先执行同作用域的函数声明。
[引]解析器在向执行环境中加载数据时,对函数声明和函数表达式并非一视同仁。解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问);至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解释执行。
EG: 以下代码不会报错
alert(sum(10,10));
function sum(num1, num2){
return num1 + num2;
}
因为在代码开始执行之前,解析器就已经通过一个名为函数声明提升(function declaration hoisting)的过程,读取并将函数声明添加到执行环境中。对代码求值时,JavaScript引擎在第一遍会声明函数并将它们放到源代码树的顶部。所以,即使声明函数的代码在调用它的代码后面,JavaScript 引擎也能把函数声明提升到顶部。
'function' 关键字什么时候用作 表达式,什么时候又用作 声明?
规则很简单
当js解析器看到function出现在main code flow,function被认为是声明。
当 function 作为语句(statement)的一部分出现的,都是表达式。
(可以看能不能加分号来判断,能加分号的都为语句(statement)。)