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 动画基础教程
Dec 25 Javascript
Javascript 实现TreeView CheckBox全选效果
Jan 11 Javascript
再谈javascript图片预加载技术(详细演示)
Mar 12 Javascript
Javascript 面向对象编程(coolshell)
Mar 18 Javascript
JQuery实现鼠标滑过显示导航下拉列表
Sep 12 Javascript
Jquery获取当前城市的天气信息
Aug 05 Javascript
JavaScript中cookie工具函数封装的示例代码
Oct 11 Javascript
JavaScript自定义分页样式
Jan 17 Javascript
详解vue-cli构建项目反向代理配置
Sep 07 Javascript
Angular实现搜索框及价格上下限功能
Jan 19 Javascript
详解Vue文档中几个易忽视部分的剖析
Mar 24 Javascript
Vue3.0中的monorepo管理模式的实现
Oct 14 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 增加了对 .ZIP 文件的读取功能
2006/10/09 PHP
php开启安全模式后禁用的函数集合
2011/06/26 PHP
php输出xml属性的方法
2015/03/19 PHP
jquery ajax 同步异步的执行示例代码
2010/06/23 Javascript
基于jQuery实现左右div自适应高度完全相同的代码
2012/08/09 Javascript
jquery动画1.加载指示器
2012/08/24 Javascript
javascript分页代码(当前页码居中)
2012/09/20 Javascript
For循环中分号隔开的3部分的执行顺序探讨
2014/05/27 Javascript
JS文字球状放大效果代码分享
2015/08/19 Javascript
基于jQuery实现的仿百度首页滑动选项卡效果代码
2015/11/16 Javascript
javascript实现的左右无缝滚动效果
2016/09/19 Javascript
微信小程序 wxapp地图 map详解
2016/10/31 Javascript
在vue项目中,使用axios跨域处理
2018/03/07 Javascript
[01:02:34]TFT vs VGJ.T Supermajor 败者组 BO3 第二场 6.5
2018/06/06 DOTA
使用Python脚本对Linux服务器进行监控的教程
2015/04/02 Python
python实现数值积分的Simpson方法实例分析
2015/06/05 Python
Python进阶_关于命名空间与作用域(详解)
2017/05/29 Python
Python3.6使用tesseract-ocr的正确方法
2018/10/17 Python
Python实现Linux监控的方法
2019/05/16 Python
基于django micro搭建网站实现加水印功能
2020/05/22 Python
.img/.hdr格式转.nii格式的操作
2020/07/01 Python
快速解释如何使用pandas的inplace参数的使用
2020/07/23 Python
python如何调用百度识图api
2020/09/29 Python
css3中单位px,em,rem,vh,vw,vmin,vmax的区别及浏览器支持情况
2016/12/06 HTML / CSS
意大利一家专营包包和配饰的网上商店:Borse Last Minute
2019/08/26 全球购物
女娲补天教学反思
2014/02/05 职场文书
中式婚礼主持词
2014/03/13 职场文书
事业单位人员的自我评价范文
2014/09/21 职场文书
整改报告怎么写
2014/11/06 职场文书
个人求职自荐信范文
2015/03/06 职场文书
行政介绍信范文
2015/05/04 职场文书
少年派的奇幻漂流观后感
2015/06/08 职场文书
2016大一新生军训感言
2015/12/08 职场文书
2019年励志签名:致拼搏路上的自己
2019/10/11 职场文书
Matlab如何实现矩阵复制扩充
2021/06/02 Python
Redis分布式锁的7种实现
2022/04/01 Redis