Javascript 调用';这';在这些例子中?

Javascript 调用';这';在这些例子中?,javascript,this,Javascript,This,我在读Crockford的《JS:好的部分》。他有两个例子使用这个,我不明白为什么在一个例子中他使用这个,在另一个例子中他使用那个 第一个例子: String.method('deentify', function() { var entity = { quot: '"', lt: '<', gt: '<' }; return function() { return this

我在读Crockford的《JS:好的部分》。他有两个例子使用这个,我不明白为什么在一个例子中他使用
这个
,在另一个例子中他使用
那个

第一个例子:

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()); 
为什么第一个示例可以直接访问此?该示例与后面的示例有什么区别?

当您执行
obj.f()
时,
函数中的
f
将引用
obj

在第一个示例中,对字符串调用了
deentify()
。在该函数中,他只需要调用函数的对象,字符串,这就是
deentify()
函数将要引用的
this

为什么我们需要
那个

add1
函数需要以某种方式存储对原始
add
函数的引用
add1
无法使用
this
,因为它未被称为
add.add1
。这可以通过在
上创建一个闭包来克服,在这个闭包中,他保存了对您在上执行的函数
curry()
add()
)的引用

调用
add.curry()
时,此
将引用
add
函数。(因为您在
add
上调用了
curry()。由于curry函数内部的闭包,
将保留其值,并且在调用
add1()
时仍将引用
add
函数

如果在从
curry()
返回的函数中使用了
,则它将引用
窗口
对象

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));
注意:需要注意的是,第一个代码段中的第一个
返回
表示
deentify()
函数,而第二个代码段中的第一个
返回
表示
curry()
函数的返回值


如果你想了解咖喱的
参数
/
apply()
魔力,只需在评论中提问,我很乐意详细说明。

什么是
String.method
Function.method
?!在第一个示例中,立即执行的函数的作用域是全局的。尝试
console.log(function(){console.log(this)}())
。当您不通过范围时,它将是全局的。(
Window
在浏览器中)它们是自定义添加的助手函数,用于向指定原型添加方法;也就是说Function.method在函数原型中添加了一个方法,等等。非常好的解释。完全有道理。我应该更加关注调用上下文。我理解apply是如何工作的,但感谢您提供的解释@艾弗里我很高兴你喜欢它。谢谢你的反馈。
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));