好的,这可能会让我获得Headslam of the Day徽章。
为什么this
在以下代码中指向window
?
if (!String.prototype.Trim)
{
String.prototype.Trim = function()
{
var result = this.replace(/^\s+|\s+$/g, "");
return result;
};
}
据我了解,this
应该评估当前字符串实例的值。相反,它正在评估当前的窗口对象。因此,以下失败了:
var baz = 'foo bar '.Trim();
请注意,此代码已经使用了相当长的一段时间,并且基于我在intartoobs上广告中看到的代码。所以这种模式似乎是推荐的做法。我无法弄清楚为什么this
没有指向我认为它应该指向的数据。 (在Visual Studio中,当我将鼠标悬停在它上面,或在“监视”窗口中查看它时,它显示为[object window]
)。
(IE 8 [32位]; Win7;普通HTML页面。)
答案 0 :(得分:1)
在Visual Studio中,当我将鼠标悬停在上面时 它,或在手表窗口中查看, 它显示为[对象窗口]
听起来像VS中的范围解析错误。这不可能是IE中的一个错误,否则数以千计的原型函数就会崩溃。
答案 1 :(得分:0)
我最近遇到了这个问题,发现原因是JS捆绑器修改了我的代码。我可以通过将修改String.prototype
的代码包含在匿名函数中,然后调用它来解决此问题。
所以代替:
String.prototype.myFunction = function () { ... }
我必须写:
(function () {
String.prototype.myFunction = function () {
...
}
})();