'history',无限制全局变量和window.history

时间:2019-06-22 20:24:12

标签: javascript reactjs react-router

所以我遇到了React问题,如果我尝试使用“历史记录”,我的代码将无法运行,告诉我这是“ history no-restricted-global的意外使用”。

我求助于StackOverflow以获得帮助,令人惊讶的是,我能够找到我正在处理的问题的答案。

另一个用途建议的修复效果很好,但是现在我迷惑了为什么它首先起作用。

使用redux,我通过mapDispatchToProps调用了一个方法。我需要将“历史记录”作为传入的变量之一,以便可以将用户重定向到他们所在的上一页。

最初,我尝试仅将“历史记录”本身用作变量,但是在尝试编译时会出现“无限制全局”错误,因此我转向了StackOverflow。这是他们建议我尝试使用“ window.history”的时候。一开始我很怀疑,因为我认为没有什么简单的解决方案可以解决我的问题,但是瞧瞧,它编译成功了。

props.addExperience(data, history);

vs。

props.addExperience(data, window.history);

window.history有效。有人可以解释一下window.history为什么起作用,但是历史本身不起作用吗?

“历史”到底是什么? “窗口”可以解决什么问题?

编辑:this是我发现的原始StackOverflow帖子。 Chasen Bettinger能够解决此问题,但他从未真正解释过为什么窗口。将解决此问题。如果这里有人可以做到,那就太好了。

1 个答案:

答案 0 :(得分:1)

您正在尝试解决的插入规则要解决的问题是,隐式引用全局对象上的属性是easy source of bugs。例如:

var status = false;
if (status) {
  console.log('status is actually truthy!');
}

在这里,顶层的status实际上是指window.status,它必须始终是一个字符串。将false分配给它会导致false变成'false'

如果status是该规则的受限全局变量,则只有在您明确引用status的情况下,才能在顶层使用window.status。这样,很明显,您是在故意指代全局属性,这不是偶然的。

当您引用window.history而不是history时,同样的事情也在发生。例如,如果在代码的前面定义了变量

,该怎么办?
var histry;

然后使用

props.addExperience(data, history);

lint不能确定您是否要引用全局对象上的属性,或者是否输入了错字。因此,有一条规则可以使您明确指定该属性位于window上(或更正变量名)。

关于window.history实际上是什么,see MDN

  

Window.history只读属性返回对History对象的引用,该对象提供了用于操纵浏览器会话历史记录(在当前页面所加载的标签或框架中访问的页面)的接口。

例如

history.back();     // equivalent to clicking back button
history.go(-1);     // equivalent to history.back();
window.history.go(0); // refresh the current page
history.pushState(stateObj, "page 2", "bar.html"); // add an item to the history state