【问题标题】:Why does window.location.reload need to be wrapped in a function(){}?为什么 window.location.reload 需要包装在 function(){} 中?
【发布时间】:2013-10-01 21:45:50
【问题描述】:

我已经编写了一些代码来向页面添加一个按钮:

var myButt = document.createElement('button');
myButt.onclick = window.location.reload;
myButt.innerText = 'Reload';

document.body.appendChild(myButt);

但是它会抛出一个错误:

TypeError:类型错误

将其包装在一个函数中可以解决问题:

myButt.onclick = function(){ window.location.reload(); };

但我的问题是为什么前者不起作用?

执行air.trace(typeof(window.location.reload)); 输出function

来自高级用户的An answer 建议它应该是可能的。肯定更简洁。

我正在运行 Adob​​e AIR 3.6(运行 Webkit),如果这有影响的话。

【问题讨论】:

  • “单独使用window.location.reload 不起作用,因为在执行侦听器时,该函数中this 的值被设置为它正在侦听的对象”。 stackoverflow.com/questions/7213369/…
  • 函数只是一个函数和一个认为它是一个方法的函数之间存在细微的差别。区别在于thisthis 的值(通常)取决于函数的调用方式。 @KevinBeal:您可能希望将该评论扩展为答案。
  • @KevinBeal 将我的代码更改为myButt.onclick = window.location.reload.bind(window.location); 现在会引发此错误:TypeError: instanceof 在具有无效原型属性的对象上调用(使用the MDN bind compatibility function
  • 如果您仔细查看您所指的高级用户的代码,您会发现情况并非如此。该人的代码有el.onclick = forgotpass;。请注意,forgotpass 本身是一个函数。

标签: javascript air webkit


【解决方案1】:

this 值在这样使用时不正确。
this 原来是 myButt,而您需要它是 window.location

要解决这个问题(hehe),要么像你做的那样包装它,要么给它绑定一个新的this 值:

myButt.onclick = window.location.reload.bind(window.location);

我刚刚测试过,它可以在 Firefox 23.0.1 上运行。




为了将来参考,他使用的是here找到的Function.prototype.bind兼容性代码。

使用我上面的代码,他得到了错误

TypeError:在具有无效原型的对象上调用了 instanceof 属性

为了解决这个问题,我将该兼容性代码的第 18 行更改为以下内容:

fNOP.prototype = this.prototype || {};

这是为了将原型设置为空白对象,因为window.location.reload 自然没有原型。

【讨论】:

  • 正如我上面评论的那样,该代码抛出 TypeError: instanceof called on an object with an invalid prototype property
  • 好的,我明白了。在该兼容性代码的第 18 行,将行更改为:fNOP.prototype = this.prototype || {};
  • 之所以这样做是因为“window.location.reload”没有原型属性,所以在.bind()失败
  • 但我还是得到了答案——因为绑定到this。如果您愿意,请随意进一步调试,但这已经足够了!
  • 供其他人将来参考:Joe 添加|| {} 的评论使这项工作完美!
猜你喜欢
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
相关资源
最近更新 更多