Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
D
docs
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
px
docs
Commits
b7b0ba92
提交
b7b0ba92
authored
8月 11, 2020
作者:
许志图
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
增加JavaScript文章
上级
a025345e
隐藏空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
124 行增加
和
7 行删除
+124
-7
_sidebar.md
_sidebar.md
+1
-1
JavaScript中方法作为参数传递.md
javascript/JavaScript中方法作为参数传递.md
+123
-0
JavaScript方法作为参数传递.md
javascript/JavaScript方法作为参数传递.md
+0
-6
image-20200811214756655.png
javascript/assets/image-20200811214756655.png
+0
-0
没有找到文件。
_sidebar.md
浏览文件 @
b7b0ba92
...
...
@@ -2,7 +2,7 @@
*
常用工具
*
[
wrk压测工具
](
tools/wrk.md
"The greatest guide in the world"
)
*
前端知识
*
[
JS回调函数理解
](
javascript/JavaScript方法作为参数传递.md
"方法传参"
)
*
[
JS回调函数理解
](
javascript/JavaScript
中
方法作为参数传递.md
"方法传参"
)
*
配置
*
flutter
...
...
javascript/JavaScript中方法作为参数传递.md
0 → 100644
浏览文件 @
b7b0ba92
# JavaScript中方法作为参数传递
> 在JavaScript中方法是一等公民,一等公民可以作为函数参数,可以作为函数返回值,也可以赋值给变量
## 问题来源

## 以一个示例来理解一下
1.
首先我们写个定时器,规定从1开始打印,一次加1
```
javascript
function
countPlus
()
{
let
count
=
0
setInterval
(()
=>
{
count
++
console
.
log
(
count
)
},
1000
)
}
countPlus
()
```
运行 node demo.js,可查看结果: 1 2 3 4 ...
2.
有一个方法计算一个数+100
```
javascript
function
sumInfo
(
val
)
{
console
.
log
(
val
+
100
)
}
sum
(
1
)
```
运行后会输出: 101
3.
此时我们要调用countPlus的定时任务方法,每秒执行一次,但要求输出的每个值都加100,此时我们需要在countPlus中定义回调函数,将方法sumInfo作为参数传递给countPlus,代码如下:
```
javascript
function
countPlus
(
cb
)
{
let
count
=
0
setInterval
(()
=>
{
count
++
cb
(
count
)
},
1000
)
}
// 以上代码一般为底层或API提供的代码,无法改变!以下为调用代码
function
sumInfo
(
val
)
{
console
.
log
(
val
+
100
)
}
countPlus
(
sumInfo
)
// 上面这一行可以如下实现
countPlus
((
res
)
=>
{
console
.
log
(
res
+
100
)
})
```
运行后会输出: 101 102 103 104 ...
4.
参照一下vue的实现,优化一下
**Vue中的钩子函数即是这样实现的,定义在某个特定的时候调用回调**
```
javascript
const
Vue
=
{
addCountOne
(
cb
)
{
let
count
=
0
setInterval
(()
=>
{
count
++
cb
(
count
)
},
1000
)
}
}
//
Vue
.
addCountOne
((
res
)
=>
{
console
.
log
(
res
+
100
)
})
```
## 延伸一下
[
Array.prototype.sort()
](
https://link.zhihu.com/?target=https%3A//developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
)
在对一些复杂数据结构进行排序时,可以使用
**自定义的比较函数**
作为参数:
```
javascript
var
employees
=
[
{
name
:
"Liu"
,
age
:
21
},
{
name
:
"Zhang"
,
age
:
37
},
{
name
:
"Wang"
,
age
:
45
},
{
name
:
"Li"
,
age
:
30
},
{
name
:
"zan"
,
age
:
55
},
{
name
:
"Xi"
,
age
:
37
}
];
// 员工按照年龄排序
employees
.
sort
(
function
(
a
,
b
)
{
return
a
.
age
-
b
.
age
;
});
// 员工按照名字排序
employees
.
sort
(
function
(
a
,
b
)
{
var
nameA
=
a
.
name
;
var
nameB
=
b
.
name
;
if
(
nameA
<
nameB
)
{
return
-
1
;
}
if
(
nameA
>
nameB
)
{
return
1
;
}
return
0
;
});
```
> 这样写看起来没什么大不了的,但是对于JavaScript引擎来说就省事多了,因为它不需要为每一种数据类型去实现一个排序API,它只需要实现一个排序API就够了,至于数组元素大小怎么比较,交给用户去定义,用户如果非得说2大于1,那也不是不可以。
>
> 换句话说,如果Array.prototype.sort()只能实现简单数据(比如Number与String)的排序的话,那它就太弱了,正因为可以使用函数作为参数,使它的功能强大了很多。
>
> 顺便提一下,实现一个Array.prototype.sort(),可不是什么简单的事情,大家可以看看[V8是怎样实现数组排序的](https://link.zhihu.com/?target=https%3A//v8.dev/blog/array-sort)。
## 相关链接
[
JavaScript深入浅出
](
https://blog.fundebug.com/tags/JavaScript深入浅出/
)
[
如何理解在 JavaScript 中 "函数是第一等公民" 这句话?
](
https://www.zhihu.com/question/67652709
)
javascript/JavaScript方法作为参数传递.md
deleted
100644 → 0
浏览文件 @
a025345e
# JavaScript方法作为参数传递
> 在JavaScript中方法是一等公民,一等公民可以作为函数参数,可以作为函数返回值,也可以赋值给变量
javascript/assets/image-20200811214756655.png
0 → 100644
浏览文件 @
b7b0ba92
960.2 KB
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论