我在看别人代码的时候,有看到代码是这样写的 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币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于Django和OpenCV的智能车视频处理系统.zip
- (源码)基于ESP8266的WebDAV服务器与3D打印机管理系统.zip
- (源码)基于Nio实现的Mycat 2.0数据库代理系统.zip
- (源码)基于Java的高校学生就业管理系统.zip
- (源码)基于Spring Boot框架的博客系统.zip
- (源码)基于Spring Boot框架的博客管理系统.zip
- (源码)基于ESP8266和Blynk的IR设备控制系统.zip
- (源码)基于Java和JSP的校园论坛系统.zip
- (源码)基于ROS Kinetic框架的AGV激光雷达导航与SLAM系统.zip
- (源码)基于PythonDjango框架的资产管理系统.zip