【问题标题】:Best way of checking method availability in JavaScript在 JavaScript 中检查方法可用性的最佳方法
【发布时间】:2017-06-24 00:45:57
【问题描述】:

当我想在 JavaScript 中使用一些相对较新的方法时,比如说history.pushState,我应该在调用它之前检查它是否真的可用。我发现人们正在使用许多不同的方法来检查方法的可用性,我曾经使用自己的简单方法,这在每种情况下都对我有用。无论如何,我仍然不确定我的方法是否完全正确且广泛兼容,因为过度使用不太舒服的方式让我思考,人们使用这种方式而不是简单方式的真正原因是什么。

所以我希望回答说我的方法也完全可以,或者解释一下,在哪些情况下我的方法可能会失败,因此使用它不好。

我是这样用的:

history.pushState && history.pushState('?attr');

只是因为提前拒绝了条件,如果pushState不存在,就不会被调用。它适用于我尝试过的所有方式,并且没有任何警告。

其他不太舒服的方式,我发现人们正在使用(在 IF 中):

  1. typeof(history.pushState) == 'function'
  2. typeof history.pushState !== 'undefined'
  3. "pushState" in history
  4. typeof(history.pushState) === typeof(Function)

我的看法

在我看来,在 JavaScript 中检查变量的可用性或命名我的 if (anythingUndefined) {} 是完全可以的。当然,当变量为 0、false、null 等时,它可能是假阴性,但这不是我的问题的重点,因为以这种方式测试方法或对象总是等于 true。

【问题讨论】:

标签: javascript


【解决方案1】:

在调用函数之前使用您描述的“简单”方式来检查函数是否存在是完全可以的,人们选择其他方式的原因主要是因为它们对于非 javascript“专家”来说更具可读性,如果你重新使用带有编码风格配置的jslint 之类的工具,当您使用x && x() 时,它会向您发出警告,因为对于某些人或拥有“编码风格合同”的公司来说,这只是一种糟糕的编码风格开发商必须申请。

P.s 我最喜欢的方式是:

 if(typeof history.pushState === 'function') {
     history.pushState('?attr');
 }

 // or if you don't like that much strings inside your code
 if(typeof history.pushState === typeof Function) {
     history.pushState('?attr');
 }

【讨论】:

    【解决方案2】:

    如果您查看this answer,它会解释您要查找的大部分内容。 in 关键字检查对象是否具有该属性,无论它是否被设置过。如果您查看一些现代 JavaScript 技术教程,这似乎是首选方式。例如,这里是 Google 关于Service Workers 的教程,它使用此语法进行检查。

    【讨论】:

      【解决方案3】:

      你的方法会失败...

      • 如果有人(你使用的一些代码)用一个不是函数的真实值覆盖history.pushState

      • 或者如果有人覆盖history

      • 或者如果您定义了一个名为 history 的变量,则它不引用全局历史对象

      如果您可以排除这些错误来源,您的方法就可以正常工作。

      但如果您必须在多个地方使用pushState(),请将方法保存到某个变量并检查空对象的概念。

      var pushState = history && typeof history.pushState === "function"?
          history.pushState.bind(history):
          function(){};
      

      并将其用作

      pushState('?attr');
      

      history.pushState() 是否存在

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-22
        • 1970-01-01
        相关资源
        最近更新 更多