关于JavaScript中“this”保留字的问题

时间:2011-01-05 08:13:33

标签: javascript this

我对JavaScript中的this保留字有疑问。

查看以下代码:

Function.prototype.method = function (name, func) {
    if (!this.prototype[name]) {
        this.prototype[name] = func;
    }        
};

String.method('deentityify', function () {

    var entity = {
        quot: '"',
        lt: '<',
        gt: '>'
    };

    return function () {

        /*if (this === String.prototype) {
            alert('true');
        } else {
            alert('false');
        }*/

        return this.replace(/&([^&;]+);/g,
            function (a, b) {
                var r = entity[b];
                return typeof r === 'string' ? r : a;
            }
        );
    };
}());

document.write('&lt;&quot;&gt;'.deentityify());

您可以在以下位置修改上述代码:http://jsfiddle.net/G3Tkm/

我的问题是:

第27行this的{​​{1}}保留字是什么?

我猜:return this.replace(/&([^&;]+);/g,,但事实并非如此。

this === String.prototype的类型是字符串,'&lt;&quot;&gt;'的类型是对象。所以this

非常感谢!

1 个答案:

答案 0 :(得分:5)

每当我在JavaScript代码中找到this关键字时,我通常只会向上看,直到找到它所在的周围函数。

然后我尝试理解如何从外部调用此函数。这很重要,因为this的值会根据函数的调用方式而改变。

从您的代码中看来,String.method()的工作似乎是将方法添加到 String 对象的原型链中。这是你不应该做的事情,它是一种糟糕的JavaScript行为,可能会在以后引起一些问题。

但是,为了便于说明,每当您在字符串上调用deentityify方法时,例如"foo".deentityify() - 假设这会调用您在String.method('deentityify', function () {中分配的任何内容 - {{1变成另一个函数本身(如果我认为this正常工作)。

因此,当使用String.method时,"foo".deentityify()()会引用来电者this"foo".deentityify()的来电者实际上是"foo".deentityify()本身。

所以基本上"foo",在你的情况下,是指你正在调用方法的String对象。