JavaScript';s*this*关键字从string.prototype中指向窗口
好吧,这可能会为我赢得“每日头条”徽章 为什么JavaScript';s*this*关键字从string.prototype中指向窗口,javascript,prototype,this,Javascript,Prototype,This,好吧,这可能会为我赢得“每日头条”徽章 为什么此在下面的代码中指向窗口 if (!String.prototype.Trim) { String.prototype.Trim = function() { var result = this.replace(/^\s+|\s+$/g, ""); return result; }; } 据我所知,这个应该计算为当前字符串实例的值。而是对当前窗口对象求值。因此,以下方面惨遭失败: var ba
此
在下面的代码中指向窗口
if (!String.prototype.Trim)
{
String.prototype.Trim = function()
{
var result = this.replace(/^\s+|\s+$/g, "");
return result;
};
}
据我所知,这个
应该计算为当前字符串实例的值。而是对当前窗口对象求值。因此,以下方面惨遭失败:
var baz = 'foo bar '.Trim();
请注意,此代码已经使用了相当长的一段时间,并且基于我在intartoobs上看到的到处都是的广告代码。因此,这种模式似乎是推荐的方法。我不明白为什么这个没有指向我认为它应该指向的数据。(在Visual Studio中,当我将鼠标悬停在它上方或在“监视”窗口中查看它时,它显示为[对象窗口]
)
(IE 8[32位];Win7;普通ole HTML页面。)
在Visual Studio中,当我将鼠标悬停在
或者在“手表”窗口中查看,
它显示为[对象窗口]
听起来像是VS中的一个范围解析错误。这不可能是IE中的错误,否则数千个原型函数将被破坏。我最近遇到了这个问题,发现原因是JS捆绑包损坏了我的代码。我可以通过在匿名函数中封装代码修改String.prototype
,然后调用它来修复它
因此,不是:
String.prototype.myFunction = function () { ... }
我不得不写:
(function () {
String.prototype.myFunction = function () {
...
}
})();
似乎对我来说很好(即使在IE6中)。你能发布更多的上下文吗?是的…对我来说很好。检查您是否确实在浏览器上尝试过它,或者这只是在VS中进行的?您如何测试/调试此代码?我正在研究这个问题,并认为问题与Trim函数(或者可能是“var baz=…”函数)的执行上下文有关。window对象是IE中的全局对象,我怀疑您的函数是在全局上下文中执行的,这导致“this”解析为“window”…我正在Visual STudio中执行此操作。我将重置从IE启动的项目,以验证问题不是由WebDev引起的。此外,还涉及其他原型功能。我将消除所有其他问题,并将它们逐一添加回去,以查看其中是否有一个是导致问题的原因。我会把结果告诉你们的!谢谢你的反馈!当我“捆绑”或“打包”一段Javascript代码以减小其大小时,我也遇到了这种情况。