var obj = {
method: function (arg) {
var self = this; // 让嵌套的函数访问到this
someFunction(..., function() {
self.otherMethod(arg);
});
},
otherMethod: function (arg) { ... }
}
科里化后你可以这么写:
复制代码 代码如下:
var obj = {
method: function (self, arg) { // 附加参数`self`
someFunction(..., function() {
self.otherMethod(arg);
});
}.curryThis(), // 传入附加参数
otherMethod: function (arg) { ... }
}
我们把隐含的参数this转换成了显式的参数self.换句话说:我们把一个动态的this转换成了一个静态的变量self.如果this总是作为一个显式的参数,则JavaScript会变的更简单点.
实现curryThis():
复制代码 代码如下:
Function.prototype.curryThis = function () {
var f = this;
return function () {
var a = Array.prototype.slice.call(arguments);
a.unshift(this);
return f.apply(null, a);
};
};
6.如果你不想扩展函数原型
上面实现的方法都是加在了内置构造函数Function()的原型上.你应该可以轻松的将它们重写为独立的函数.
复制代码 代码如下:
function uncurryThis(f) {
return function () {
return f.call.apply(f, arguments)
};
}
function curryThis(f) {
return function () {
var a = Array.prototype.slice.call(arguments);
a.unshift(this);
return f.apply(null, a);
};
}
7.在uncurryThis()安全的使用在已经存在的不信任的代码中
Mark Miller把uncurryThis()作为例子讲解了“安全的元编程”:
译者注:科里化this就是把函数的第一个参数转换成方法中的this.反科里化this就是把方法中的this转换成函数的第一个参数.
您可能感兴趣的文章: