当前位置: 首页 > news >正文

JS编程建议——71:推荐分支函数

建议71:推荐分支函数
分支函数解决的一个问题是浏览器之间兼容性的重复判断。解决浏览器之间的兼容性的一般方式是使用if逻辑来进行特性检测或能力检测,根据浏览器不同的实现来实现功能上的兼容,这样做的问题是,每执行一次代码,可能都需要进行一次浏览器兼容性方面的检测,这是没有必要的。能否在代码初始化执行的时候就检测浏览器的兼容性,在之后的代码执行过程中,就无须再进行检测了呢?
答案是:能。分支技术就可以解决这个问题,下面以声明一个XMLHttpRequest实例对象为例进行介绍。
var XHR = function() {

var standard = {
    createXHR : function() {
        return new XMLHttpRequest();
    }
}
var newActionXObject = {
    createXHR : function() {
        return new ActionXObject("Msxml2.XMLHTTP");
    }
}
var oldActionXObject = {
    createXHR : function() {
        return new ActionXObject("Microsoft.XMLHTTP");
    }
}
if(standard.createXHR()) {
    return standard;
} else {
    try {
        newActionXObject.createXHR();
        return newActionXObject;
    } catch(o) {
        oldActionXObject.createXHR();
        return oldActionXObject;
    }
}

}();
从上面的例子可以看出,分支的原理就是:声明几个不同名称的对象,但为这些对象声明一个名称相同的方法(这是关键)。这些不同的对象,却拥有相同的方法,根据不同的浏览器设计各自的实现,接着开始进行一次浏览器检测,并且由浏览器检测的结果来决定返回哪一个对象,这样不论返回的是哪一个对象,最后名称相同的方法都作为对外一致的接口。
这是在JavaScript运行期间进行的动态检测,将检测的结果返回赋值给其他的对象,并且提供相同的接口,这样存储的对象就可以使用名称相同的接口了。其实,惰性载入函数跟分支函数在原理上是非常相近的,只是在代码实现方面有差异。

相关文章:

  • 第五十四课、被遗弃的多重继承(下)
  • 拖拽div大小
  • 4xx错误的本质:服务器已经接收到请求
  • sql server 查询表结构
  • Swift 中异常抛出和四种异常处理
  • JDK Tools and Utilities---Java Troubleshooting, Profiling, Monitoring and Management Tools
  • Sagit.Framework For IOS 开发框架入门开发教程2:一行代码实现引导页
  • 简单实现UIlabel可复制功能
  • 大数据学习系列之五 ----- Hive整合HBase图文详解
  • REST开放接口生成文档工具之apidoc
  • 自建Maven仓库 - Artifactory
  • 微信管理
  • 推荐一个提升工作效率的小插件[intellij-postfix-templates]
  • 面试(1)
  • ios - 关于拖动手势简单应用场景
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • C++类中的特殊成员函数
  • canvas 绘制双线技巧
  • django开发-定时任务的使用
  • echarts的各种常用效果展示
  • ES6语法详解(一)
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • JavaScript 一些 DOM 的知识点
  • Python利用正则抓取网页内容保存到本地
  • React+TypeScript入门
  • React系列之 Redux 架构模式
  • Redis字符串类型内部编码剖析
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • vue-loader 源码解析系列之 selector
  • 百度地图API标注+时间轴组件
  • 力扣(LeetCode)965
  • 前端技术周刊 2019-01-14:客户端存储
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  •  一套莫尔斯电报听写、翻译系统
  • 2017年360最后一道编程题
  • FaaS 的简单实践
  • 阿里云移动端播放器高级功能介绍
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (3)STL算法之搜索
  • (转)程序员技术练级攻略
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .gitignore文件_Git:.gitignore
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .NET应用架构设计:原则、模式与实践 目录预览
  • @SuppressWarnings注解
  • [20170705]lsnrctl status LISTENER_SCAN1
  • [23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians
  • [AIGC] 如何建立和优化你的工作流?