当我想在JavaScript中使用一些相对较新的方法时,让我们说history.pushState
,我应该在调用之前检查它是否真的可用。我发现人们使用了很多不同的方法来检查方法的可用性,而我过去常常使用我自己的简单方法,这在每种情况下都适用于我。无论如何,我仍然不确定,如果我的方法是完全正确和广泛兼容的,因为过度使用不太舒服的方式让我想到,人们使用它而不是简单方法的真正原因是什么。
所以我希望回答说我的方法也完全没问题,或解释一下,我的方法可能会失败,所以使用它是不好的。
我正在使用这种方式:
history.pushState && history.pushState('?attr');
由于早期拒绝条件,如果pushState不存在,则不会被调用。它在我尝试的所有方面都有效,没有任何警告。
其他不太舒服的方式,我发现人们正在使用(在IF中):
typeof(history.pushState) == 'function'
typeof history.pushState !== 'undefined'
"pushState" in history
typeof(history.pushState) === typeof(Function)
我的意见
在我看来,在JavaScript中检查变量的可用性或命名我的if (anythingUndefined) {}
是完全没问题的。当然,当变量有0,false,null等时,它可能是假阴性,但这不是我的问题,因为测试方法或对象总是等于true。
答案 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()