Javascript curry:返回函数中的上下文

时间:2013-01-17 11:49:19

标签: javascript functional-programming closures

在像这样的咖喱函数中:

var curry = function() {
    var slice = Array.prototype.slice,
        args = slice.call(arguments),
        fn = args.shift();

    return function(){
        return fn.apply(null, args.concat(slice.call(arguments)));
    };
};

this中的nullfn.apply之间有什么区别吗?我没有看到它可以产生影响的情况。


编辑:

感谢this answer我认为现在很清楚,这是我做的一个小例子:

function msg() {
    console.log(this.name);
}

var foo = { name: "foo"};

var msg_this = curry_this(msg);
var msg_null = curry_null(msg);

msg_this();         //msg.call(null) -> undefined
msg_null();         //msg.call(null) -> undefined
msg_this.call(foo); //msg.call(foo) -> foo
msg_null.call(foo); //msg.call(null) -> undefined

curry_this返回fn.apply(this,...curry_null返回fn.apply(null...

1 个答案:

答案 0 :(得分:1)

null传递给应用会使上下文成为全局上下文(浏览器中为window)。

来自the MDN

  

如果方法是非严格模式代码中的函数,则为null   undefined将替换为全局对象和原始对象   价值将被装箱。

这将如何影响结果取决于fn函数(curry的第一个参数)以及您如何调用它。

请参阅此代码:

var a = {curried: curry(function(){console.log(this)})};
a.curried();

如果您通过null申请,则会记录window而不是对象a

相关问题