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 相关文章推荐
prototype 1.5相关知识及他人笔记
Dec 16 Javascript
IE event.srcElement和FF event.target 功能比较
Mar 01 Javascript
node.js中的console.timeEnd方法使用说明
Dec 09 Javascript
JS实现弹性菜单效果代码
Sep 07 Javascript
js图片轮播手动切换效果
Nov 10 Javascript
jquery文字填写自动高度的实现方法
Nov 07 Javascript
详解Vue中状态管理Vuex
May 11 Javascript
Js自定义多选框效果的实例代码
Jul 05 Javascript
Vue Cli与BootStrap结合实现表格分页功能
Aug 18 Javascript
Vue-cli@3.0 插件系统简析
Sep 05 Javascript
详解React中共享组件逻辑的三种方式
Feb 02 Javascript
JS开发前端团队展示控制器来为成员引流
Aug 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 最大运行时间 max_execution_time修改方法
2010/03/08 PHP
ThinkPHP之foreach标签使用概述
2014/06/30 PHP
PHP嵌套输出缓冲代码实例
2015/05/12 PHP
PHP实现冒泡排序的简单实例
2016/05/26 PHP
用CSS+JS实现的进度条效果效果
2007/06/05 Javascript
使用javascript实现雪花飘落的效果
2015/01/13 Javascript
JQuery创建DOM节点的方法
2015/06/11 Javascript
jquery动态导航插件dynamicNav用法实例分析
2015/09/06 Javascript
跟我学习javascript的prototype,getPrototypeOf和__proto__
2015/11/17 Javascript
JS模拟简易滚动条效果代码(附demo源码)
2016/04/05 Javascript
JS实现禁止用户使用Ctrl+鼠标滚轮缩放网页的方法
2017/04/28 Javascript
node.js+jQuery实现用户登录注册AJAX交互
2017/04/28 jQuery
js构建二叉树进行数值数组的去重与优化详解
2018/03/26 Javascript
解决ant Design Search无法输入内容的问题
2020/10/29 Javascript
使用Python下载歌词并嵌入歌曲文件中的实现代码
2015/11/13 Python
Django日志模块logging的配置详解
2017/02/14 Python
python实现解数独程序代码
2017/04/12 Python
Python中xml和json格式相互转换操作示例
2018/12/05 Python
python使用time、datetime返回工作日列表实例代码
2019/05/09 Python
linux环境中没有网络怎么下载python
2019/07/07 Python
如何在python中写hive脚本
2019/11/08 Python
python pyecharts 实现一个文件绘制多张图
2020/05/13 Python
基于python和flask实现http接口过程解析
2020/06/15 Python
如何用python批量调整视频声音
2020/12/22 Python
Marlies Dekkers内衣美国官方网上商店:高端内衣品牌
2018/11/12 全球购物
美国家用和厨房电器销售网站:Appliances Connection
2020/01/24 全球购物
学校卫生检查制度
2014/02/03 职场文书
公司寄语大全
2014/04/10 职场文书
最新优秀教师个人先进事迹材料
2014/05/06 职场文书
C++程序员求职信
2014/05/07 职场文书
社团活动总结格式
2014/08/29 职场文书
基层党员干部四风问题整改方向和措施
2014/09/25 职场文书
全国爱牙日活动总结
2015/02/05 职场文书
2015中秋节晚会主持词
2015/07/01 职场文书
教育教学读书笔记
2015/07/02 职场文书
详解MySQL主从复制及读写分离
2021/05/07 MySQL