2015-06-17 69 views
0

最近我进入了一些调用函数式编程的东西,并且我学习了call(),bind()和apply()..但是我仍然不太明白,因为我从不使用函数式编程方法在Javascript中。功能函数内的函数

像功能的功能

function checkGreater(limit){ 
    return function(limit, item){ 
     return item > limit; 
    }.bind(this,limit); 

} 

内这听起来对我来说这使事情变得更加复杂。我们什么时候需要函数方法中的函数?像上面的示例代码一样。

+0

那么,当你有一个高阶函数应该返回一个新的函数,那么你必须在它内部创建该函数。 –

回答

1

这样的例子利用JavaScript的闭包来实现所谓的“工厂”。 Here's an article on MDN that discusses closures and factories

function checkGreater(limit) { 
    return function(limit, item) { 
     return item > limit; 
    }.bind(this, limit); 
} 

在这个例子中,这是一个工厂,返回一个可以传递参数并检查传入的参数是否比传递到工厂限值的功能。下面是使用例子:

var greaterThanTen = checkGreater(10); 

这将返回:

function (10, item) { 
    return item > 10; 
} 

,并将其存储到greaterThanTenbind的第一个参数称为函数的调用上下文,在这个简单的示例中,由于没有使用上下文,所以上下文无关紧要,但可以通过使用this关键字在函数内引用。

然后你可以使用greaterThanTen这样的:

if (greaterThanTen(5)) { 
    console.log('5 is greater than 10'); // never gets called 
} 

if (greaterThanTen(11)) { 
    console.log('11 is greater than 10'); // this gets called 
} 

如果我不过写我自己的工厂要做到这一点,我可能会写它像这样:

function checkGreater(limit) { 
    return function(item) { 
     return item > this; 
    }.bind(limit); 
} 

这确实与上面的例子完全相同,除了工厂使用内部函数的调用上下文来设置限制。

请注意,在strict mode这将完全按预期工作。但是,在“宽松”模式下,this将被强制为new Number(limit),这不是原始值,不能使用严格相等运算符===进行比较。谢谢@FelixKling提醒我这个陷阱。

+0

在你的工厂,这是指什么? –

+0

@EltonJamie在最后一个例子中,'.bind()'将'limit'绑定到'this',所以'checkGreater(15)'会返回一个带有'15'绑定到返回函数'this'的函数。 –

+0

关于将'limit'绑定到'this':这只能在严格模式下才有效。在“松散”模式下,'this'的值将被强制转换为一个对象,这会导致各种其他问题(主要是关于等式比较的问题)。 –