大家好,我是IT修真院萌新分院的张晓琳,一枚正直、纯洁、善良的前端程序员。
今天给大家分享一下,修真院官网任务js-task6,深度思考的知识点——函数声明与函数表达式的区别?.
1.背景介绍
什么是函数声明?
函数声明可以定义命名的函数变量,而无需给变量赋值。函数声明是一种独立的结构,不能嵌套在非功能模块中。可以将它类比为 变量声明。就像变量声明必须以“var”开头一样,变量声明必须以“function”开头。函数名在自身作用域和父作用域内是可获取的(否则就取不到函数了)。
什么是函数表达式?
函数表达式将函数定义为表达式语句(通常是变量赋值)的一部分。通过函数表达式定义的函数可以是命名的,也可以是匿名的。函数表达式不能以“function”开头(下面自调用的例子要用括号将其括起来)。函数名(如果有的话)在作用域外是不可获取的(与 Function Declaration 对比)。
2.知识剖析
Javascript Function无处不在,而且功能强大!通过Javascript函数可以让JS具有面向对象的一些特征,实现封装、继承等,也可以让代码得到复用。但事物都有两面性,Javascript函数有的时候也比较“任性”,你如果不了解它的“性情”,它很可能给你制造出一些意想不到的麻烦(bugs)出来。 Javascript Function有两种类型:
// 函数声明
function funDeclaration(type){
return type==="Declaration";
}
// 函数表达式
var funExpression = function(type){
return type==="Expression";
}
3.常见问题
两者之间有什么区别?
4.解决方案
一、函数声明中函数名是必须的;函数表达式中则是可选的
//函数表达式
var s = function sum(a, b) {
return a + b;
}
alert(s(1, 2));
var s = function(a, b) {
return a + b;
}
alert(s(1, 2));
//以上两种都可以
//函数声明
function sum(a, b) {
return a + b;
}
alert(sum(1, 2));
二、用函数声明定义的函数,函数可以在函数声明之前调用,而用函数表达式定义的函数只能在声明之后调用。
//函数声明
alert(sum(1, 2));//3
function sum(a, b) {
return a + b;
}
//函数表达式:发生错误
try {
alert(s(1, 2));
var s = function sum(a, b) {
return a + b;
}
}
catch (e) {
alert("wrong!");
}
5.编码实战
6.扩展思考
使用function关键字声明一个函数,再指定一个函数名,叫函数声明。
function fn(){……}
使用function关键字声明一个函数,但未给函数命名,最后将匿名函数赋予一个变量,叫函数表达式。
var fn=function(){……}
使用function关键字声明一个函数,但未给函数命名,这个又称之为什么呢?是属于以上两钟类型的哪一种?
function(){……}
匿名函数属于函数表达式,匿名函数有很多作用,赋予一个变量则创建函数,赋予一个事件则成为事件处理程序或创建闭包等等.
7.参考文献
参考二:函数申明与函数表达式的区别
参考三:雨落川下雪
参考四:详解Javascript 函数声明和函数表达式的区别
8.更多讨论
1.函数声明和函数表达式的区别到底是什么?
答:myFunctionDeclaration 是一个包含其它函数声明(innerFunction)的函数声明
函数表达式总是其它JavaScript语句的一部分:
var myFunc = function(){};
或者其他函数的参数:
myFunc(function() {
return function(){};
});
或者立即执行函数:
(function namedFunctionExpression () { })();
或者被为运算符修饰:
+function(){}();
2. 那么对于何为声明,何为函数表达式呢?
答:建函数的最常用的两个方法是函数表达式和函数声明,两者期间的区别是有点晕,因为ECMA规范只明确了一点:函数声明必须带有标示符(Identifier)(就是大家常说的函数名称),而函数表达式则可以省略这个标示符:
函数声明:
function 函数名称 (参数:可选){ 函数体 }
函数表达式:
function 函数名称(可选)(参数:可选){ 函数体 }
3. 函数声明与函数表达式除了以代码放的位置不同区别,还有哪些不同?
答:函数声明必须有函数名,而函数表达式的函数名可以省略。
函数声明必须有函数名是因为函数被调用的基本要求,在调用一个函数时我们必须能够引用它,而唯一的方法就是通过函数名。
函数表达式是其它JavaScript语句的一部分,所以我们有别的方式引用它们,比如函数被赋值给一个变量,可以通过变量名来访问:
var doNothing = function(){};
doNothing();
或者作为其它函数的参数,可以通过参数名访问:
function doSomething(action) {
action();}
关于立即执行函数的讨论
也就是说只有函数表达式才能实现立即执行,匿名函数也是函数表达式为何不能立即执行呢,因为匿名函数开始的function会被JavaScript引擎识别为函数声明的开始,所以加上括号也不会被执行了,而加上(),!,+,-等符号为什么就可以了呢,因为加上这些符号就可以告诉JavaScript引擎这不是函数声明了,就这么简单。