在JavaScript中检查方法可用性的最佳方法

时间:2017-06-24 00:45:58

标签: javascript

当我想在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)
  5. 我的意见

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

3 个答案:

答案 0 :(得分:0)

使用您所描述的“简单”方式在调用之前检查函数是否存在是完全正常的,人们选择其他方式的原因主要是因为它们对于非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');
 }

答案 1 :(得分:0)

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

答案 2 :(得分:0)

你的方法会失败......

  • 如果某人(您使用的某些代码)使用非功能的真实值覆盖history.pushState

  • 或有人覆盖history

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

如果您可以排除这些错误来源,那么您的方法可以正常使用。

但是如果必须在多个地方使用pushState(),请将方法保存到某个变量并查看null-objects的概念。

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

并将其用作

pushState('?attr');

是否存在history.pushState()