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 判断元素上是否绑定了事件
Oct 28 Javascript
Extjs TimeField 显示正常时间格式的代码
Jun 28 Javascript
jQuery实现页面滚动时层智能浮动定位实例探讨
Mar 29 Javascript
jquery插件开发注意事项小结
Jun 04 Javascript
JS获取节点的兄弟,父级,子级元素的方法
Jan 09 Javascript
JavaScript判断变量是否为空的自定义函数分享
Jan 31 Javascript
kindeditor修复会替换script内容的问题
Apr 03 Javascript
JavaScript中的Function函数
Aug 27 Javascript
JavaScript截取指定长度字符串点击可以展开全部代码
Dec 04 Javascript
微信小程序实现搜索功能并跳转搜索结果页面
May 18 Javascript
JavaScript的垃圾回收机制与内存管理
Aug 06 Javascript
微信小程序组件生命周期的踩坑记录
Mar 03 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中获取时间的下一周下个月的方法
2014/03/18 PHP
PHP不用递归实现无限分级的例子分享
2014/04/18 PHP
PHP模拟http请求的方法详解
2016/11/09 PHP
thinkphp 手机号和用户名同时登录
2017/01/20 PHP
PHP7新特性
2021/03/09 PHP
javascript 播放器 控制
2007/01/22 Javascript
一些mootools的学习资源
2010/02/07 Javascript
javascript遍历控件实例详细解析
2014/01/10 Javascript
JS清空多文本框、文本域示例代码
2014/02/24 Javascript
Bootstrap每天必学之js插件
2015/11/30 Javascript
js实现图片轮播效果
2015/12/19 Javascript
JavaScript判断是否是微信浏览器
2016/06/13 Javascript
angular route中使用resolve在uglify压缩后问题解决
2016/09/21 Javascript
anime.js 实现带有描边动画效果的复选框(推荐)
2017/12/24 Javascript
JavaScript设计模式之模板方法模式原理与用法示例
2018/08/07 Javascript
Bootstrap4 gulp 配置详解
2019/01/06 Javascript
Vue.js实现的购物车功能详解
2019/01/27 Javascript
javascript面向对象三大特征之多态实例详解
2019/07/24 Javascript
JS实现点餐自动选择框(案例分析)
2019/12/10 Javascript
谈谈JavaScript中的垃圾回收机制
2020/09/17 Javascript
Python时间戳与时间字符串互相转换实例代码
2013/11/28 Python
简单说明Python中的装饰器的用法
2015/04/24 Python
flask 框架操作MySQL数据库简单示例
2020/02/02 Python
Evisu官方网站:日本牛仔品牌,时尚街头设计风格
2016/12/30 全球购物
刊首寄语大全
2014/04/11 职场文书
任命书模板
2014/06/04 职场文书
总经理检讨书
2014/09/15 职场文书
先进个人申报材料
2014/12/30 职场文书
2015年毕业生个人自荐书
2015/03/24 职场文书
2015年污水处理厂工作总结
2015/05/26 职场文书
新闻报道稿范文
2015/07/23 职场文书
假期读书倡议书3篇
2019/08/19 职场文书
创业计划书之青年旅馆
2019/09/23 职场文书
分享几个JavaScript运算符的使用技巧
2021/04/24 Javascript
python模板入门教程之flask Jinja
2022/04/11 Python
tomcat下部署jenkins的方法
2022/05/06 Servers