JS typeof fn === 'function' && fn()详解


Posted in Javascript onAugust 22, 2020

我在看别人代码的时候,有看到代码是这样写的

function(){
fn&&fn()
}

大概意思是这么个意思,但是这我感觉这样写好像没意义,有带佬能指点一下吗

fn 不存在就什么都不做,不会报错,fn 存在才尝试执行 fn

一般来说fn && fn()就如同下面的语句

if (fn) {
fn()
}

一般来说函数的动态调用,因为不知道这个函数确定存在才会这么判断

大部分情况是这个意思,如果 fn 是 undefined 就不执行 fn()。React 针对 optional callback 会这么写。

在 js 里面,这是标准的。大幅减少代码量,比三目运算更直接了当。别的语言大同小异:fn?.xx()

这样写思路是对的,实现是错误的,fn 可能存在,但是它可能不是 function,执行 fn() 一样会出错。

下面分享正确的写法

typeof fn === "function" && fn()

实际应用

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()
 }
}

小结

正确写法应该时这个吧:typeof(fn)==='function' && fn(),不过通常约定 fn&&fn() 传递的一定是函数

这个就是 js 逻辑运算符的魔法:
当多个 &&串联时,执行到第一个 truthy 的表达式;
当多个||串联时,执行到第一个 false-thy 的表达式;
但我比较赞同王垠博客上的观点:短路机制是给程序优化执行效率的,不是给程序员拿来炫技的。

更多的可以查看这篇文章:

就是?.操作符,不包括方括号,我把引号打成方括号了。
可以参见这里:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining

进入可以选择简体中文。

Javascript 相关文章推荐
JQuery jsonp 使用示例代码
Aug 12 Javascript
利用JQuery和JS实现奇偶行背景颜色自定义效果
Nov 19 Javascript
win7下安装配置node.js+express开发环境
Dec 06 Javascript
jQuery获取单击节点对象的方法
Jun 02 Javascript
JavaScript实现倒计时跳转页面功能【实用】
Dec 13 Javascript
ES6 Promise对象概念与用法分析
Apr 01 Javascript
JS使用ActiveXObject实现用户提交表单时屏蔽敏感词功能
Jun 20 Javascript
荐书|您有一份JavaScript书单待签收
Jul 21 Javascript
VUE中使用MUI方法
Feb 12 Javascript
如何通过JS实现转码与解码
Feb 21 Javascript
jquery实现烟花效果(面向对象)
Mar 10 jQuery
Node.js path模块,获取文件后缀名操作
Nov 07 Javascript
js+canvas实现图片格式webp/png/jpeg在线转换
Aug 22 #Javascript
JavaScript中的函数式编程详解
Aug 22 #Javascript
微信小程序中data-key属性之数据传输(经验总结)
Aug 22 #Javascript
Vue 电商后台管理项目阶段性总结(推荐)
Aug 22 #Javascript
vue实现移动端H5数字键盘组件使用详解
Aug 25 #Javascript
探究一道价值25k的蚂蚁金服异步串行面试题
Aug 21 #Javascript
js实现页面导航层级指示效果
Aug 25 #Javascript
You might like
php mssql 分页SQL语句优化 持续影响
2009/04/26 PHP
几个优化WordPress中JavaScript加载体验的插件介绍
2015/12/17 PHP
php自定义函数实现二维数组按指定key排序的方法
2016/09/29 PHP
php 人员权限管理(RBAC)实例(推荐)
2017/05/24 PHP
JavaScript 全面解析各种浏览器网页中的JS 执行顺序
2009/02/17 Javascript
javascript removeChild 使用注意事项
2009/04/11 Javascript
jQuery学习3:操作元素属性和特性
2010/02/07 Javascript
js获取时间(本周、本季度、本月..)
2013/11/22 Javascript
Jquery的Tabs内容轮换效果实现代码,几行搞定
2014/02/12 Javascript
js中settimeout方法加参数
2014/02/28 Javascript
jquery实现select选中行、列合计示例
2014/04/25 Javascript
js实现input框文字动态变换显示效果
2015/08/19 Javascript
深入浅析JavaScript中的作用域和上下文
2016/03/26 Javascript
jquery层级选择器(匹配父元素下的子元素实现代码)
2016/09/05 Javascript
轻松掌握JavaScript状态模式
2016/09/07 Javascript
js实现移动端编辑添加地址【模仿京东】
2017/04/28 Javascript
JS脚本加载后执行相应回调函数的操作方法
2018/02/28 Javascript
详解webpack编译速度提升之DllPlugin
2019/02/05 Javascript
[04:27]2014DOTA2国际邀请赛 NAVI战队官方纪录片
2014/07/21 DOTA
Python实现的建造者模式示例
2018/08/06 Python
Python 实现文件打包、上传与校验的方法
2019/02/13 Python
Django将默认的SQLite更换为MySQL的实现
2019/11/18 Python
详解HTML5 data-* 自定义属性
2018/01/24 HTML / CSS
Under Armour安德玛德国官网:美国高端运动科技品牌
2019/03/09 全球购物
HomeAway英国:全球领先的度假租赁在线市场
2020/02/03 全球购物
Simons官方网站:加拿大时尚零售商
2020/02/20 全球购物
请用用Java代码写一个堆栈
2012/01/26 面试题
培训讲师邀请函
2014/01/10 职场文书
开会迟到检讨书
2014/02/03 职场文书
浪费资源的建议书
2014/03/12 职场文书
好人好事演讲稿
2014/09/01 职场文书
入学证明
2015/06/23 职场文书
2016年春节问候语
2015/11/11 职场文书
情况说明书格式及范文
2019/06/24 职场文书
zabbix配置nginx监控的实现
2022/05/25 Servers
JS前端使用canvas实现扩展物体类和事件派发
2022/08/05 Javascript