js 代码,函数中如何进行追加写入新代码

2020-08-06 08:52:43 +08:00
 mostkia

这里有一个很基本的函数:

function box(val){
	console.log('假设这是函数原有代码');
	val();  //这是回调函数
}

现在控制台运行它的结果是这样的:

box(function(){console.log('回调函数 01')});  //返回 [假设这是函数原有代码] + [回调函数 01 ] 
box(function(){console.log('回调函数 02')});  //返回 [假设这是函数原有代码] + [回调函数 02 ] 

很正常,上一次的结果被这次的参数替代掉了

现在要达到的需求:

box(function(){console.log('回调函数 01')});  //返回 [假设这是函数原有代码] + [回调函数 01 ] 
box(function(){console.log('回调函数 02')});  //返回 [假设这是函数原有代码] + [回调函数 01 ] + [回调函数 02 ] 

说简单点就是:如何在一个函数内追加新的代码片段,更新这个 box 函数,还不能执行它(它也是回调函数,有条件才能激活的) 请问该如何做到,如果有懂得 v 友,还希望不要吝啬赐教。

4323 次点击
所在节点    JavaScript
30 条回复
ianva
2020-08-06 11:00:42 +08:00
也可以做一个 curry factory,对这一类问题做处理
const curryFactory = fn => {
__const list = [];
__return (...args) => {
____if (args.length) {
______console.log(args);
______list.push(...args);
____} else {
______return fn(...list);
____}
__};
};

全部源码,https://codesandbox.io/s/elated-cartwright-szp2w
ianva
2020-08-06 11:01:36 +08:00
const box1 = curryFactory((...args) => {
__Array.from(args).forEach(item => item());
})
box1(() => {
__console.log("1");
});
box1(() => {
__console.log("2");
});
box1();
ianva
2020-08-06 11:10:59 +08:00
@wellsc 并不是一个好的特性,特别是当年 for in 的时候还会把原型方法遍历出来,必须 hasOwnProperty,所以大部分的库都不会选择轻易的通过原型方法做入侵
wellsc
2020-08-06 11:17:55 +08:00
@ianva 但就是因为有了原型链,才可以让 js 有这么多范式的方言啊
ianva
2020-08-06 11:22:25 +08:00
@wellsc 有很多种方式可以实现 oo 特性,这并不是最好的选择
mostkia
2020-08-06 12:28:18 +08:00
好的,感谢诸位,不一一 @了浪费大家时间了,有意义的回复均已感谢~
catch
2020-08-06 13:13:08 +08:00
我看了你最近问的两个问题,标题都写的很奇怪,实则就都很基础的 js
mostkia
2020-08-06 22:26:31 +08:00
@catch emm 。。怎么说呢,你说的的确有道理,比如像我之前的一个问题。其实吧,我提问的主要动机,主要是不知道一些偏门的需求自己这样闭门造车实现出来,代码是不是走偏了,发出来看看大家是怎么解决的,笨办法都是有的,但有最优解我肯定是想要了解一下的,看到大家都是这样做的,一般也就没差了。
Exceptionluo
2020-08-07 09:48:15 +08:00
function box(val) {
console.log('假设这是函数原有代码');
box.ar = box.ar || []
box.ar.push(val)
box.ar.forEach(element => {
element()
});
}
mostkia
2020-08-07 16:51:22 +08:00
@Exceptionluo 好的,有效,感谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/696018

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX