我在看别人代码的时候,有看到代码是这样写的 function(){ fn&&fn() } 大概意思是这么个意思,但是这我感觉这样写好像没意义,有带佬能指点一下吗 fn 不存在就什么都不做,不会报错,fn 存在才尝试执行 fn 一般来说fn && fn()就如同下面的语句 if (fn) { fn() } 一般来说函数的动态调用,因为不知道这个函数确定存在才会这么判断 大部分情况是这个意思,如果 fn 是 undefined 就不执行 fn()。React 针对 optional callback 会这么写。 在 js 里面,这是标准的。大幅减少代码量,比三目运算更直接了当。别的语言大 在JavaScript编程中,我们经常会遇到对函数存在的判断和调用,以确保在调用函数之前,函数已经被定义。`typeof fn === 'function' && fn()` 这种模式就是一种常见的方式来确保安全地调用函数。这个模式的核心在于利用了JavaScript中的逻辑与(`&&`)操作符的短路特性。 `typeof fn` 返回一个字符串,表示变量 `fn` 的类型。如果 `fn` 是一个函数,`typeof fn` 会返回 `'function'`。如果 `fn` 未定义、null 或者其他非函数类型,`typeof fn` 会返回其他字符串,如 `'undefined'`、`'object'` 等。 然后,`typeof fn === 'function'` 这个表达式是一个布尔值,只有当 `fn` 是一个函数时,其结果才为 true。`&&` 操作符左边的条件为真时,它才会继续评估右边的表达式。因此,如果 `fn` 不是一个函数,`fn()` 将不会被执行,避免了因尝试调用非函数类型的值而引发的错误。 `fn && fn()` 这种写法虽然简洁,但在某些情况下可能会导致问题。如果 `fn` 可能存在但不是函数,比如它可能是一个 null 或者 undefined,这种情况下,`fn()` 依然会被尝试调用,从而引发错误。因此,更严谨的写法是 `typeof fn === 'function' && fn()`,确保在调用 `fn()` 之前,已经验证了 `fn` 是一个函数。 在实际应用中,比如在加载外部脚本并执行回调函数的场景下,我们可以看到这样的代码: ```javascript function addScript(url, fn) { var script = document.createElement('script'); script.setAttribute('type', 'text/javascript'); script.setAttribute('src', url); script.setAttribute('async', 'async'); document.getElementsByTagName('head')[0].appendChild(script); script.onload = function () { typeof fn === 'function' && fn(); }; } ``` 在这个例子中,`addScript` 函数负责动态加载脚本,并在脚本加载完成后调用 `fn` 函数。`typeof fn === 'function' && fn()` 确保了只有在 `fn` 是一个函数时,才会执行它,从而避免了潜在的错误。 总结来说,`typeof fn === 'function' && fn()` 这种模式是 JavaScript 中一种优雅的函数调用检查方式,它可以防止因函数未定义或非函数类型而引发的错误。同时,它也体现了JavaScript逻辑运算符的短路特性,提高了代码的可读性和安全性。然而,需要注意的是,尽管这种方式简洁,但过度依赖这种技巧可能会降低代码的可理解性。因此,在编写代码时,平衡可读性和效率是很重要的。
- 粉丝: 5
- 资源: 948
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 【java毕业设计】智慧社区金融服务门户.zip
- 【java毕业设计】智慧社区法律咨询门户.zip
- 灾难类型检测3-YOLO(v5至v11)、COCO、Paligemma、VOC数据集合集.rar
- 【java毕业设计】智慧社区智慧安防系统.zip
- 【java毕业设计】智慧社区智能家居门户.zip
- 【java毕业设计】智慧社区旅游服务平台.zip
- Java高分大作业-基于SpringBoot的学生信息管理系统源码
- SQLServer的灾难恢复PDF
- 基于LSTM网络的语音识别
- 手机投手机-甲壳虫ADB1.2.1.apk
- 【java毕业设计】智慧社区能源管理系统.zip
- 【java毕业设计】智慧社区环保监测系统.zip
- 【java毕业设计】智慧社区垃圾分类门户.zip
- 电流闭环到速度闭环无缝切-示例代码 ,它特别适合对传统的三段式启动方式 定位->电流闭环强拖->速度闭环进行优化,它能够自适应各种负载大小的情况,切过程中电流和速度连续不突变,启动平稳顺滑 发
- 【java毕业设计】智慧社区儿童教育平台.zip
- 一套遵循原生态开发模式的 Web UI 组件库,采用自身轻量级模块化规范,极易上手,可以更简单快速地构建网页界面