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 相关文章推荐
索趣科技的答案
Feb 07 Javascript
用循环或if语句从json中取数据示例
Aug 18 Javascript
jQuery中:not选择器用法实例
Dec 30 Javascript
jQuery使用prepend()方法在元素前添加内容用法实例
Mar 26 Javascript
详解JavaScript对Date对象的操作问题(生成一个倒数7天的数组)
Oct 01 Javascript
javascript结合Flexbox简单实现滑动拼图游戏
Feb 18 Javascript
详解BootStrap中Affix控件的使用及保持布局的美观的方法
Jul 08 Javascript
JS库之Three.js 简易入门教程(详解之一)
Sep 13 Javascript
利用Node.js检测端口是否被占用的方法
Dec 07 Javascript
Angular6笔记之封装http的示例代码
Jul 27 Javascript
解决layui前端框架 form表单,table表等内置控件不显示的问题
Aug 19 Javascript
如何让node运行es6模块文件及其原理详解
Dec 11 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中在数据库中保存Checkbox数据(2)
2006/10/09 PHP
几个学习PHP的网址
2006/11/25 PHP
介绍php设计模式中的工厂模式
2008/06/12 PHP
php中的strpos使用示例
2014/02/27 PHP
WordPress中注册菜单与调用菜单的方法详解
2015/12/18 PHP
php中的常用魔术方法汇总
2016/02/14 PHP
Laravel框架搜索分页功能示例
2019/02/01 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
建议大家看下JavaScript重要知识更新
2007/07/08 Javascript
jquery中输入验证中一个不错的效果
2010/08/21 Javascript
Javascript面向对象编程
2012/03/18 Javascript
十个迅速提升JQuery性能让你的JQuery跑得更快
2012/12/10 Javascript
非常漂亮的JS+CSS图片幻灯切换特效
2013/11/20 Javascript
jQuery表格插件ParamQuery简单使用方法示例
2013/12/05 Javascript
JS遍历Json字符串中键值对先转成JSON对象再遍历
2014/08/15 Javascript
js完美实现@提到好友特效(兼容各大浏览器)
2015/03/16 Javascript
深入解析桶排序算法及Node.js上JavaScript的代码实现
2016/07/06 Javascript
第一次接触神奇的Bootstrap导航条
2016/08/09 Javascript
利用jquery实现瀑布流3种案例
2016/09/18 Javascript
Node.js测试中的Mock文件系统详解
2016/11/21 Javascript
js实现把图片的绝对路径转为base64字符串、blob对象再上传
2016/12/29 Javascript
Vue实现web分页组件详解
2017/11/28 Javascript
微信小程序自定义tabBar在uni-app的适配详解
2019/09/30 Javascript
Javascript实现单选框效果
2020/12/09 Javascript
python调用短信猫控件实现发短信功能实例
2014/07/04 Python
Python 自动补全(vim)
2014/11/30 Python
Python判断值是否在list或set中的性能对比分析
2016/04/16 Python
Python3安装Pillow与PIL的方法
2019/04/03 Python
python opencv将图片转为灰度图的方法示例
2019/07/31 Python
Django实现whoosh搜索引擎使用jieba分词
2020/04/08 Python
HTML5 实现一个访问本地文件的实例
2012/12/13 HTML / CSS
日本土著品牌,综合型购物网站:Cecile
2016/08/23 全球购物
去加拿大的旅行和假期:Canadian Affair
2016/10/25 全球购物
英国儿童设计师服装的领先零售商:Base
2019/03/17 全球购物
外企C语言笔试题
2013/11/10 面试题
班主任经验交流会主持词
2014/04/01 职场文书