3

我正在阅读 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('&lt;&quot;&gt;'.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直接访问?这个例子和后面的例子有什么区别?

4

1 回答 1

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)。由于 curry 函数内部的闭包,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()returncurry()

如果您也想了解使咖喱起作用的arguments/apply()魔术,请在评论中提问,我很乐意详细说明。

于 2012-08-05T08:39:31.350 回答