将函数直接链接到函数(){}

问题描述:

因此,偶尔有一段时间,为了好玩,我检查了Facebook的来源以找到各种疯狂的JavaScript。因此,在Facebook上的聊天textarea的KEYUP将函数直接链接到函数(){}

,我发现:

Bootloader.loadComponents(["control-textarea"], function() { 
    TextAreaControl.getInstance(this) 
}.bind(this)); 

这似乎并不直到我意识到那.bind()直接加入该功能引起我的兴趣。

我不知道你能做到这一点。

任何功能都可以跟其他function(){}一样吗?或者是否有一种特殊的方式需要这样做。

我知道你可以连锁像"How are you doing!".replace(/\w{3}/g,'').toUpperCase()这样的东西,但并不认为你直接链接到function(){}本身。

+0

您不是“链接”function(){}调用,而是链​​接'.loadComponents()'调用。 – Blender 2012-08-04 17:46:40

+0

它们在'.loadComponents()'里面“链接”函数。 'function(){ TextAreaControl.getInstance(this) } .bind(this)' – Shawn31313 2012-08-04 17:48:54

+0

@Blender:不按照括号顺序。看来loadComponents正在传递两个参数。一个数组和一个链接绑定调用的匿名函数 – jdi 2012-08-04 17:49:00

.bind是功能对象在ES5环境中可用的属性,或.bind已被添加到Function.prototype。它就像对象或原型链上可用的任何其他属性一样。

.bind方法返回一个新的函数及其调用上下文(以及提供的参数)永久绑定到该新函数。新函数调用原始函数的代码体,所以除了绑定的上下文和参数之外,行为是相同的。

+0

感谢文档@Bergi。 :) – 2012-08-04 17:53:53

+0

哦,看到我甚至不知道你可以做'Function.prototype',我只知道使用'String','Number','Array'和'Date'的原型。谢谢 – Shawn31313 2012-08-04 17:54:05

+1

@ Shawn31313:不客气。是的,JavaScript中的函数只是另一种类型的对象。它们是独一无二的,因为它们是可调用对象,但在大多数其他方面,它们非常类似于任何其他对象。你可以添加属性给他们。这就是例如'jQuery'既可以是一个函数,也可以是一个名称空间。 '$(“foobar”)'和'$ .extend()'都是有效的,即使'$'是一个函数。还有其他常用的'Function.prototype'属性,比如'.call'和'.apply'。 – 2012-08-04 17:55:40