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)。)
posted @ 2016-04-07 10:42  Sameen  阅读(103)  评论(0编辑  收藏  举报