您的位置:首页 > Web前端 > JavaScript

【JavaScript 学习--12】--js 中两种函数定义的区别:函数声明和函数表达式

2018-03-05 11:21 295 查看
在JS里面的函数实际上是对象,每个函数都是Function类型的实例,而且都与其它引用类型一样具有属性和方法。由于函数是对象,因此函数名实际上是指向函数对象的指针, 不会与某个函数绑定。函数的定义有两种方式:函数声明和函数表达式。下面我们就对这两种方法进行总结。

一句话可以概括为:函数是对象,函数名是指针。

函数声明 和函数表达式 定义

//函数声明
function sum(num1, num2) {
return num1 + num2;
}

//函数表达式
var sum = function(num1, num2) {
return num1 + num2;
};


以上第二种方式(函数表达式)定义了变量sum并将其初始化为一个函数。注意该函数末尾有一个分号,就像声明其它变量一样。

所以由于函数名是指针,因此函数名与包含对象指针的其它变量没有什么不同。换句话说,一个函数可能会有多个名字。

例如:

function sum(num1, num2) {
return num1 + num2;
}

alert(sum(10, 20)); // 30

var Fsum = sum;
alert(Fsum(10, 20)); // 30

var sum = null;
alert(Fsum(10, 20)); // 30


函数声明 和函数表达式 区别

实际上,JS解析器在向执行环境加载数据时,对函数声明和函数表达式并非一视同仁。解析器会预先读取函数声明,并使其在执行任何代码之前可用;至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解释执行。所以请看下面例子:

alert(sum(10, 20)); // 30
function sum(num1, num2) {
return num1 + num2;
}


以上代码完全可以正常运行,结果会为30。因为在代码执行之前,解析器就已经通过名为函数声明提升的过程,读取并将函数声明添加到执行环境了。对代码求值时,JS引擎在在预加载时就把声明函数放到源代码树的顶端了。所以,即使声明函数在调用它的代码后面,JS引擎也能把它提升到顶部。如果改成等价的函数表达式,就会在执行期间报错。

alert(sum(10, 20)); // unexpected identifier
var sum = function(num1, num2) {
return num1 + num2;
}


以上代码会在运行期间产生错误,原因在于在执行到函数所在的语句之前,变量sum中不会保存对函数的引用;而且,由于第一行代码就会导致“unexpected identifier”(意外标识符)错误,实际上不会执行到下一行代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: