我对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('<">'.deentityify());
您可以在以下位置修改上述代码:http://jsfiddle.net/G3Tkm/
我的问题是:
第27行this
的{{1}}保留字是什么?
我猜:return this.replace(/&([^&;]+);/g,
,但事实并非如此。
this === String.prototype
的类型是字符串,'<">'
的类型是对象。所以this
非常感谢!
答案 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对象。