Javascript 调用';这';在这些例子中?
我在读Crockford的《JS:好的部分》。他有两个例子使用这个,我不明白为什么在一个例子中他使用Javascript 调用';这';在这些例子中?,javascript,this,Javascript,This,我在读Crockford的《JS:好的部分》。他有两个例子使用这个,我不明白为什么在一个例子中他使用这个,在另一个例子中他使用那个 第一个例子: String.method('deentify', function() { var entity = { quot: '"', lt: '<', gt: '<' }; return function() { return this
这个
,在另一个例子中他使用那个
第一个例子:
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());
为什么第一个示例可以直接访问此?该示例与后面的示例有什么区别?当您执行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));