大家好,我是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
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(函数式编程)分不开。