[英]Passing arguments in anonymous functions in JavaScript
有时我看到用参数编写的JavaScript,只要已经有一个设置值或者是一个带方法的对象。 以这个jQuery示例为例:
$(".selector").children().each(function(i) {
console.log(i);
});
当登录i
,你会得到什么价值i
看孩子选择在jQuery的时候是在迭代each
方法。
拿这个Node.js例子:
http.createServer(function(request, response) {
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World");
response.end();
}).listen(8888);
您可以在此处看到正在传递request
和response
,并且它们包含可以对其执行操作的自己的方法。
对我来说,这看起来像是将一个函数传递给createServer
函数,其中两个参数已经附加了方法。
我的问题是多部分:
对我来说,这看起来像是将一个函数传递给createServer函数,其中两个参数已经附加了方法。
不,他们正在将一个函数传递给带有两个参数的createServer
。 稍后将使用调用者输入的任何参数调用这些函数。例如:
function caller(otherFunction) {
otherFunction(2);
}
caller(function(x) {
console.log(x);
});
将打印2。
更高级,如果这不是您想要的,您可以使用属于所有函数的bind方法,这将创建一个已绑定指定参数的新函数。 例如:
caller(function(x) {
console.log(x);
}.bind(null, 3);
});
现在将打印3,并且传递给匿名函数的参数2将成为未使用且未命名的参数。
无论如何,这是一个密集的例子; 请检查bind
的链接文档,以了解bind
如何更好地工作。
我们来看看$.each
示例:
each: function (obj, callback, args) {
var value,
i = 0,
length = obj.length,
isArray = isArraylike(obj);
if (args) {
if (isArray) {
for (; i < length; i++) {
value = callback.apply(obj[i], args);
if (value === false) {
break;
}
}
} else {
for (i in obj) {
value = callback.apply(obj[i], args);
if (value === false) {
break;
}
}
}
// A special, fast, case for the most common use of each
} else {
if (isArray) {
for (; i < length; i++) {
value = callback.call(obj[i], i, obj[i]);
if (value === false) {
break;
}
}
} else {
for (i in obj) {
value = callback.call(obj[i], i, obj[i]);
if (value === false) {
break;
}
}
}
}
return obj;
}
这是从中调用的
$(".selector").children().each(function(i) {
console.log(i);
});
喜欢:
return $.each.call(this, callback /* this is your function */, args /* which is an additional thing people rarely use*/ )
这是您想要查看的行(在第一个块中)
callback.call(obj[i], i, obj[i]);
它调用回调,并将对象作为上下文传递 - 这就是为什么你可以在循环中使用this
。 然后迭代i
和然后与上下文相同的对象都作为参数发送到回调。 这有点像魔术; 直到你看源代码。
这是将参数传递给匿名函数的示例
var a = 'hello';
// Crockford
(function(a){alert(a)}(a));
// Others
(function(a){alert(a)})(a);
它使用闭包,因为它是一个匿名函数(它实际上取决于你如何写它)
是的,您将函数作为参数传递。 您传递的函数当然会有自己的参数。
而且,这些参数可以是任何包括可能有自己方法的对象等。
http.createServer
将接受一个函数,它将知道函数的参数如何。 一种方法是检查传入函数的arguments
属性。 或者api开发人员可能已经使用了实际元素。
这个函数的作者将知道什么是期望的参数,并将在api documentation
记录它。
如果您查看createServer的代码,它看起来像这样:
function createServer (handleRequestAndResponseFunction) {
handleRequestAndResponseFunction(actualRequest, actualReponse);
}
好吧,不,不会,但这是一个简单的例子。 createServer需要一个function
接受两个参数。
用更现实的术语来说,当你传入两个参数的函数时,它会做任何中间件处理和它需要的东西,然后调用该函数,传递它自己的请求和响应变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.