我正在读Crockford的'JS:The Good Parts'。他有两个使用这个的例子,我不明白为什么在一个例子中他使用this
而在另一个例子中他使用that
。
第一个例子:
String.method('deentify', 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;
}
);
};
}());
document.writeln('<">'.deentify());
第二个例子:
Function.method('curry', function() {
var args = arguments, that = this;
return function () {
return that.apply(null, args.concat(arguments));
};
});
var add1 = add.curry(1);
document.writeln(add1(6));
为什么第一个示例可以直接访问this
?该示例与其后的示例之间有什么区别?
答案 0 :(得分:3)
当您执行obj.f()
时,this
函数内的f
会引用obj
。
在第一个示例中,在字符串上调用deentify()
。在该函数中,他只需要调用函数的对象,字符串,即this
函数中的deentify()
将引用的内容。
为什么我们需要that
add1
函数需要以某种方式存储对原始add
函数的引用。 add1
无法使用this
,因为不称为add.add1
。通过在that
上创建一个闭包来克服这一点,在该闭包中,他将对您执行的函数curry()
的引用保存在示例中的add()
上。
当您致电add.curry()
时,this
会引用add
功能。 (因为您在curry()
上调用了add
)。由于咖喱函数内部的关闭,that
将保持其值,并且在调用add
时仍会引用add1()
函数。
如果在this
返回的函数中使用curry()
,则会引用window
对象。
Function.method('curry', function() {
var args = arguments,
that = this; //reference to add
return function () {
//`apply` calls add
return that.apply(null, args.concat(arguments));
};
});
var add1 = add.curry(1);
document.writeln(add1(6));
注意:请务必注意,第一个代码段中的第一个return
表示 deentify()
函数,而第一个return
第二个代码段中的{1}}表示 curry()
函数的返回值。
如果您想了解使咖喱运作的arguments
/ apply()
魔法,请在评论中提问,我将很乐意详细说明。