繁体   English   中英

JavaScript 的 *this* 关键字从 string.prototype 中指向 window

[英]JavaScript's *this* keyword points to the window from within string.prototype

好的,这可能会为我赢得每日 Headslam 徽章。

为什么在this代码中指向window

if (!String.prototype.Trim)
{
    String.prototype.Trim = function()
    {
        var result = this.replace(/^\s+|\s+$/g, "");
        return result;
    };
}

据我了解, this应该评估为当前字符串实例的值。 相反,它正在评估当前的 window object。 因此,以下内容惨遭失败:

var baz = 'foo bar      '.Trim();

请注意,此代码已经使用了很长一段时间,并且基于我在 intartoobs 上到处看到的广告代码。 所以这种模式似乎是推荐的方式。 我不明白为什么this没有指向我认为它应该指向的数据。 (在 Visual Studio 中,当我在它上面 hover 或在 Watches window 中查看它时,它显示为[object window] )。

(IE 8 [32 位];Win7;plain-ole HTML 页面。)

在Visual Studio中,当我将鼠标悬停在它上面或在Watches窗口中查看它时,它显示为[对象窗口]

听起来像VS中的范围解析错误。 这不可能是IE中的错误,否则数以千计的原型功能就会破坏。

我最近遇到了这个问题,发现原因是JS捆绑包破坏了我的代码。 我能够通过在匿名函数中包含修改String.prototype代码然后调用它来修复它。

所以代替:

String.prototype.myFunction = function () { ... }

我不得不写:

(function () {
    String.prototype.myFunction = function () {
        ...
    }
})();

例如,当 function 名称后面的括号丢失时,我遇到了这个问题

错误

'My String'.myFunction

使固定

'My String'.myFunction()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM