gog*_*n13 41 javascript cross-browser
我希望通过以下代码行深入了解我在Safari和Chrome中看到的错误:
setTimeout(window.location.reload, 250);
Chrome报告:
Uncaught TypeError: Illegal invocation
和Safari:
TypeError: Type error
在FireFox中,代码运行正常.此外,此代码在三个浏览器中的每个浏览器中运行良好:
setTimeout((function() {
window.location.reload();
}), 250);
Run Code Online (Sandbox Code Playgroud)
Chrome和Safari对此代码没有任何问题:
var say_hello = function () { alert("hello") };
setTimeout(say_hello, 250);
Run Code Online (Sandbox Code Playgroud)
有什么特别之处window.location.reload导致这个错误?
(不确定它是否有用,但这里有一个说明这个的jsfiddle)
Tom*_*icz 65
因为reload()需要window.location如此this.换句话说 - 它是一种方法window.location.当你说:
var fun = window.location. reload;
fun();
Run Code Online (Sandbox Code Playgroud)
您正在调用reload()函数而没有任何this引用(或使用隐式window引用).
这应该工作:
setTimeout(window.location.reload.bind(window.location), 250);
Run Code Online (Sandbox Code Playgroud)
该window.location.reload.bind(window.location)部分意味着:获取window.location.reload函数并返回一个函数,该函数在被调用时将window.location用作this内部参考reload().
还有另一种方法可以做到这一点,非常简单,不需要执行额外的步骤、绑定或类似的事情。当您使用箭头函数而不是 JS 中的常见函数时,this上下文会被包含在内。因此,您可以轻松地执行以下操作:
setTimeout(() => window.location.reload(), 250);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19289 次 |
| 最近记录: |