JavaScript:引用 'this' 关键字的闭包
JavaScript: Closures referring to 'this' keyword
我在 Douglas Crockfords "JavaScript - The Good Parts" 中看到的以下示例似乎破坏了我目前对 this
应该如何在闭包内工作的理解:
String.method('deentityify', function(){
var entity = {
quot: '"',
lt: '<',
gt: '>'
};
return function(){
return this.replace(/&([^&;]+);/g,
function(a,b){
var r = entity[b];
return typeof r === 'string' ? r : a;
}
};
}());
//Just for reference
Function.prototype.method = function (name, func) {
this.prototype[name] = func;
return this;
};
deentityify
方法的闭包中所指的this
指的是执行该方法的字符串对象。这对我来说不太有意义 - 这里的 this
不应该指的是全局对象吗?
如果我们在没有很好的范围界定(即使用丑陋的全局变量)和方法绑定方法的情况下编写此代码,您将得到:
var entity = {
quot: '"',
lt: '<',
gt: '>'
};
String.prototype.deentityify = function(){
return this.replace(/&([^&;]+);/g,
function(a,b){
var r = entity[b];
return typeof r === 'string' ? r : a;
}
);
};
var s = "<".deentityify();
所以,deentityify
只是 String
对象上的一个方法。当您使用点语法调用该方法时,该方法的上下文是您调用它的字符串。
我在 Douglas Crockfords "JavaScript - The Good Parts" 中看到的以下示例似乎破坏了我目前对 this
应该如何在闭包内工作的理解:
String.method('deentityify', function(){
var entity = {
quot: '"',
lt: '<',
gt: '>'
};
return function(){
return this.replace(/&([^&;]+);/g,
function(a,b){
var r = entity[b];
return typeof r === 'string' ? r : a;
}
};
}());
//Just for reference
Function.prototype.method = function (name, func) {
this.prototype[name] = func;
return this;
};
deentityify
方法的闭包中所指的this
指的是执行该方法的字符串对象。这对我来说不太有意义 - 这里的 this
不应该指的是全局对象吗?
如果我们在没有很好的范围界定(即使用丑陋的全局变量)和方法绑定方法的情况下编写此代码,您将得到:
var entity = {
quot: '"',
lt: '<',
gt: '>'
};
String.prototype.deentityify = function(){
return this.replace(/&([^&;]+);/g,
function(a,b){
var r = entity[b];
return typeof r === 'string' ? r : a;
}
);
};
var s = "<".deentityify();
所以,deentityify
只是 String
对象上的一个方法。当您使用点语法调用该方法时,该方法的上下文是您调用它的字符串。