在这些例子中调用'this'有什么不同?

时间:2012-08-05 08:21:35

标签: javascript this

我正在读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?该示例与其后的示例之间有什么区别?

1 个答案:

答案 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()魔法,请在评论中提问,我将很乐意详细说明。