大家好,我是IT修真院武汉第10期学员,一枚正直、纯洁、善良的前端程序员。
今天给大家分享一下,修真院官网任务js-2,深度思考的知识点——函数表达式跟函数声明的区别;
1.背景介绍
什么是 Function Declaration(函数声明)?
Function Declaration 可以定义命名的函数变量,而无需给变量赋值。Function Declaration 是一种独立的结构,不能嵌套在非功能模块中。可以将它类比为 Variable Declaration(变量声明)。就像 Variable Declaration 必须以“var”开头一样,Function Declaration 必须以“function”开头。
什么是 Function Expression(函数表达式)?
Function Expression 将函数定义为表达式语句(通常是变量赋值)的一部分。通过 Function Expression 定义的函数可以是命名的,也可以是匿名的。Function Expression 不能以“function”开头(下面自调用的例子要用括号将其括起来)。
2.知识剖析
函数声明实例
函数声明实际执行顺序
函数表达式实际执行顺序
函数表达式实例
函数表达式跟变量一样,有一个var为头的名字,后面跟一个匿名函数,然后在后面调用这个变量名+()就可以调用这个函数了。在浏览器的渲染机制下,变量名get hoisted(被提升),赋值为undefined,然后浏览器再进行赋值。但是后面的函数依然按实际顺序执行,所以后面的c为2的函数获取不到了,因为函数已经return了;
3.常见问题
函数表达式创建的函数大多是匿名的。在代码调试的时候比较麻烦;
4.解决方案
建议使用 Named Function Expressions
Named Function Expressions (命名函数表达式)
5.编码实战
6.扩展思考
哪些地方不能用函数声明?
官方是禁止在非功能模块(比如 if)中使用函数声明的。但是所有浏览器都支持,但是各自的解释方式不同。
7.参考文献
8.更多讨论
详情请看:
问:Function Expression 会被提升吗?
答:这取决于表达式。
问:应该注意什么?
答:官方是禁止在非功能模块(比如 if)中使用 Function Declaration 的。但是所有浏览器都支持,但是各自的解释方式不同。
问:还有其它理由支持 Function Expression 的吗?
答:1)Function Declaration 感觉像是要模仿 Java 风格的方法声明,但是 Java 方法和 JavaScript 并不一样。在 JavaScript 中,函数是含值的 living 对象。Java 方法仅是对元数据的存储。下面的两段代码都定义了函数,但是只有 Function Expression 看着像创建了对象。
2)Function Expression 用处更多。Function Declaration 只能作为“statement”孤立存在。它所能做的就是创建一个当前作用域下的对象变量。相比之下,Function Expression(根据定义)是大型结构的一部分。如果想要创建匿名函数、给 prototype(原型)添加函数或是将函数用作其它对象的 property(属性),都可以用 Function Expression。每当用高阶应用,比如curry或compose,创建新的函数时都是在用 Function Expression。Function Expression 和 Functional Programming(函数式编程)分不开。