摘要:对这种问题的解决方法是采用回调模式。可以将节点隐藏逻辑以回调函数的方式传递给并委托执行检查参数是否为可调用复杂逻辑,筛选出符合的元素那么现在回调函数可选,重构后加入回调函数参数的仍然可以像以前一样使用,而不会破坏旧的原始代码。
1. 回调示例
如果有个模块 findeNodes() ,任务是找到期望的 DOM 元素并使用 hide() 处理:
function findNodes() { var i = 10000, nodes = [], found while (i--) { // ...复杂逻辑,筛选出符合的元素 found nodes.push(found) } return nodes } function hide(nodes) { for (let i = 0, max = nodes.length; i < max; i++) { nodes[i].style.display = "none" } } hide(findNodes())2. 改进
可以看到函数 findNodes() 和 hide() 分别两次进行了循环,这是十分低效的,如果要避免这种重复循环,并且只要在 findNodes() 中选择的时候就进行 hide() 那么将是高效的实现方式。如果在 findNodes() 中实现修改逻辑,由于检索和修改逻辑耦合,那么它将不再是一个通用函数。对这种问题的解决方法是采用回调模式。
可以将节点隐藏逻辑以回调函数的方式传递给 findNodes() 并委托执行:
function findNodes(callback) { var i = 10000, nodes = [], found if (typeof callback !== "function") { // 检查参数是否为可调用 callback = false } while (i--) { // ...复杂逻辑,筛选出符合的元素 found if (callback) { callback(found) } nodes.push(found) } return nodes } function hide(nodes) { nodes[i].style.display = "none" } findNodes(hide)
那么现在回调函数可选,重构后加入回调函数参数的 findNodes() 仍然可以像以前一样使用,而不会破坏旧 API 的原始代码。
3. 回调与作用域前面的例子中,回调执行的语句:callback(para),在多数情况下有效,但是如果传递的函数是对象的方法且有 this 那么回调方法里的 this 将指向的是全局对象,从而发生意外。
解决这个问题的方法是传递回调函数,并且还传递该回调函数所属的对象:
function findNodes (callback, callback_obj){ ... if (typeof callback === "function"){ callback.call(callback_obj, found) } ... } findNodes (obj.sayName, obj)
当然,可以把方法作为字符串来传递,避免重复两次输入该对象的名称:
findNodes (callback, callback_obj){ if (typeof callback === "string"){ callback = callback_obj[callback] } if (typeof callback === "function"){ callback.call(callback_obj, found) } } findNodes("sayName", Obj)
本文是系列文章,可以相互参考印证,共同进步~
JS 抽象工厂模式
JS 工厂模式
JS 建造者模式
JS 原型模式
JS 单例模式
JS 回调模式
JS 外观模式
JS 适配器模式
JS 利用高阶函数实现函数缓存(备忘模式)
JS 状态模式
JS 桥接模式
JS 观察者模式
网上的帖子大多深浅不一,甚至有些前后矛盾,在下的文章都是学习过程中的总结,如果发现错误,欢迎留言指出~
参考:P65
PS:欢迎大家关注我的公众号【前端下午茶】,一起加油吧~
另外可以加入「前端下午茶交流群」微信群,长按识别下面二维码即可加我好友,备注加群,我拉你入群~
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/92143.html
摘要:回调函数是在异步操作完成后传播其操作结果的函数,总是用来替代同步操作的返回指令。下面的图片显示了中事件循环过程当异步操作完成时,执行权就会交给这个异步操作开始的地方,即回调函数。 本系列文章为《Node.js Design Patterns Second Edition》的原文翻译和读书笔记,在GitHub连载更新,同步翻译版链接。 欢迎关注我的专栏,之后的博文将在专栏同步: Enc...
摘要:为了降低异步编程的复杂性,所以。难理解请参考的误区以及实践异步编程的模式异步编程的种方法 异步编程 javascript异步编程, web2.0时代比较热门的编程方式,我们平时码的时候也或多或少用到,最典型的就是异步ajax,发送异步请求,绑定回调函数,请求响应之后调用指定的回调函数,没有阻塞其他代码的执行。还有像setTimeout方法同样也是异步执行回调的方法。 如果对异步编程...
摘要:函数表达式又名匿名函数为变量赋的值是函数定义本身。在语言里任何匿名函数都是属于对象。这种情况下,就叫做回调函数。如上面代码示例展示了文档单击事件时以冒泡模式传递给回调函数的特别适用于事件驱动编程,因为回调模式支持程序以异步方式运行。 JavaScript设计模式的作用是提高代码的重用性,可读性,使代码更容易的维护和扩展 在javascript中,函数是一类对象,这表示他可以作为参数传递...
阅读 2239·2021-11-16 11:51
阅读 3439·2021-09-26 10:14
阅读 1667·2021-09-22 15:58
阅读 1068·2019-08-30 15:52
阅读 1992·2019-08-30 15:43
阅读 2594·2019-08-30 13:46
阅读 881·2019-08-30 13:10
阅读 983·2019-08-29 18:32