函数声明与函数表达式的区别?

大家好,我是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引擎这不是函数声明了,就这么简单。

ppt

视频

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容