函数声明和函数表达式
相同点
- 函数是一个值,所以和其他值一样,函数也可以进行被输出、被赋值、作为参数传给其他函数等相关操作,不管函数是以什么方式被定义的,当然和其他值的输出还是有些区别的。
- 作为参数传给其他函数。
不同点
- 函数声明必须有标识符,也就是常说的函数名;函数表达式可以省略函数名。
- 函数声明会提前。
- ECMAScript规范中表示,函数声明语句可以出现在全局代码中,或者内嵌在其他函数中,但是不能出现在循环、条件判、或者try/finally以及with语句中。
- 可以创建一个函数表达式立即执行。
声明前置
变量声明前置
JavaScript 引擎的工作方式是先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,然后给他初始值undefined,然后才逐句执行程序,这就叫做“变量提升”,也即“变量的声明前置”。
函数声明前置
和变量的声明会前置一样,函数声明同样会前置,如果我们使用函数表达式那么规则和变量一样。
如果我们使用函数声明的方式,那么即使函数写在最后也可以在前面语句调用,前提是函数声明部分已经被下载到本地。
arguments 对象
- 在 JavaScript 中,arguments 对象是比较特别的一个对象,实际上是当前函数的一个内置属性。arguments 非常类似 Array,但实际上又不是一个 Array 实例
- arguments 对象的长度是由实参个数而不是形参个数决定的。形参是函数内部重新开辟内存空间存储的变量,但是其与 arguments 对象内存空间并不重叠。对于 arguments 和值都存在的情况下,两者值是同步的,但是针对其中一个无值的情况下,对于此无值的情形值不会得以同步。
- arguments 对象中有一个非常有用的属性:callee。arguments.callee 返回此 arguments 对象所在的当前函数引用。在使用函数递归调用时可以使用 arguments.callee 代替函数名本身。
函数"重载"
判断传入参数数量
Javascript 的每个函数都带有一个仅在这个函数范围内作用的变量——arguments,它具有 length 属性。有了 length 属性,我们就可以很方便的知道函数传入了几个参数。
判断传入的参数类型
如果函数中并没有提供参数,那么 message 和 who 的值一定为 'undefined'。我们可以使用 typeof message = 'undefined' 来判断是否传入了参数。
立即执行函数
立即执行函数就是:
- 声明一个匿名函数
-
马上调用这个匿名函数
IIFE
作用:
- js中没有块级作用域,用来隔离作用域避免污染,或者截断作用域链,避免闭包造成引用变量无法释放。
- 利用立即执行特性,返回需要的业务函数或对象,避免每次通过条件判断来处理。
【注】版权归 Lucifer 所有,转载请联系作者。
网友评论