《深入理解JavaScript》——1.10 函数

简介:

本节书摘来自异步社区《深入理解JavaScript》一书中的第1章,第1.10节,作者: 【美】AxelRauschmayer(罗彻麦尔)译者: 王玉林 , 杜欢 , 庄婷婷 , 章子鹏,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.10 函数

可以通过函数声明的方式来定义函数:

  screenshot

上面的代码定义了函数add,它有两个参数:param1和param2,返回值是这两个参数的和。可以这样去调用这个函数:

  screenshot

除此之外,我们还可以通过给变量add赋值为函数表达式的方式来定义add函数:

 screenshot

函数表达式会产生一个值,因此可以将函数作为参数直接传递给另外的函数:

  screenshot

1.10.1 函数声明的提升特性
函数声明具有提升特性——它们的实体会被移动到所在作用域的开始处。这使得我们可以引用后面声明的函数。

 screenshot

注意,var声明也具有提升的特性(参见1.13.2“变量的提升特性”),但通过它们执行的赋值却不具备该特性:

 screenshot

1.10.2 特殊的变量arguments
在JavaScript中,函数的所有参数都可以被自由调用,它会通过arguments变量来使所有参数可用。arguments看起来像个数组,但却不具备数组的方法:

 screenshot

1.10.3 参数太多或太少
我们可以通过以下函数来探知,在JavaScript中,函数参数太多或太少是如何处理的(toArray()函数会在1.10.6“将arguments转换为数组”中出现):
screenshot

  

额外的参数会被忽略(arguments除外):

  .screenshot

丢失的参数会得到undefined这个值:

  screenshot

1.10.4 可选参数
以下是一个给参数赋上默认值的通用模式:

 screenshot

在标记了(1)的这行,||运算符会在x为真值的时候(非null、undefined等值)返回x,否则,会返回第二个运算数:

  screenshot

**1.10.5 强制参数长度
**如果想强制一个参数长度(指定的参数长度),可以通过arguments.length来检查:

screenshot

1.10.6 将arguments转换为数组
arguments不是数组,它只是类似于数组(参见17.15.3“类似数组的对象和泛型方法”)。它有length属性,可以通过方括号去访问它的元素。不能移除它的元素,也不能对它调用数组的方法。因此,有时候会需要将它转换成数组,方法如以下函数所示(在17.15.3“类似数组的对象和泛型方法”中会有详细介绍):

  screenshot

相关文章
|
20天前
|
JavaScript
变量和函数提升(js的问题)
变量和函数提升(js的问题)
|
20天前
|
JavaScript
常见函数的4种类型(js的问题)
常见函数的4种类型(js的问题)
11 0
|
20天前
|
JavaScript
写一个函数将N组<>(包含开始和结束),进行组合,并输出组合结果 (js)
写一个函数将N组<>(包含开始和结束),进行组合,并输出组合结果 (js)
9 0
|
1月前
|
自然语言处理 JavaScript 网络架构
js开发:请解释什么是ES6的箭头函数,以及它与传统函数的区别。
ES6的箭头函数以`=>`定义,简化了函数写法,具有简洁语法和词法作用域的`this`。它无`arguments`对象,不能用作构造函数,不支持`Generator`,且不改变`this`、`super`、`new.target`绑定。适用于简短表达式,常用于异步编程和高阶函数。
17 5
|
1月前
|
JavaScript 前端开发 网络架构
JavaScript 谈谈对箭头函数的理解及其与普通函数的区别。
JavaScript 谈谈对箭头函数的理解及其与普通函数的区别。
17 1
|
1月前
|
前端开发 JavaScript 数据处理
在JavaScript中,什么是异步函数执行的例子
在JavaScript中,什么是异步函数执行的例子
10 0
|
1月前
|
JavaScript
JS封装节流函数
JS封装节流函数
15 0
|
1月前
|
JavaScript 前端开发
javascript箭头函数
javascript箭头函数
|
1月前
|
JavaScript 小程序
微信小程序 wxml 中使用 js函数
微信小程序 wxml 中使用 js函数
70 0
|
1月前
|
JavaScript 前端开发
JavaScript函数科里化
JavaScript函数科里化