我在尝试学习javascript时遇到过两种类型的函数。我试着按照我的理解将它们放在下面。
function example(arg1, arg2) { //code to do stuff here }
和
thing.method(function(arg) {
//code to do stuff here
});
我的想法是第一种情况是创建一个名为example的函数,该函数接受两个参数,并且在大括号中发生了一些事情。我相信只要它在范围内就可以调用和使用该函数(我认为这是正确的单词?)。
在第二个我感到困惑。我的想法是,我们有一个东西(数组,对象,等等)一个方法被调用的东西(foreach,map等)然后我卡住了。有一个功能,没有名字?采用一个参数,并且在大括号内发生了一些事情。让我们说这是一个数组,我们调用foreach然后函数括号内的东西会发生在每个元素?为什么我要使用它而不是仅仅创建一个我可以调用的第一个函数?
为什么我不能说:
function example(arg) { //stuff }
thing.method(example(arg));
我可能误解了一些事情。那个人能为我清理一下吗?
答案 0 :(得分:1)
thing.method(function(arg) {
//code to do stuff here
});
这使用了所谓的匿名函数。就像你说的,它没有名字。它作为参数传递给thing.method()
。 thing.method()
的函数体将使用此函数,例如:
thing: {
method: function(callback) {
//...
callback();
//...
}
};
你不能把它写成
function example(arg) { /* stuff */ }
thing.method(example(arg));
因为在这个示例中,您将example(arg)
的返回值传递给thing.method()
,而不是函数本身。但是,您可以这样写:
function example(arg) { /* stuff */ }
thing.method(example);
现在,您可以想象method()
设置一些变量并将其传递给您传入的函数,例如:
thing: {
method: function(callback) {
var foo = "bar";
//...
callback(foo);
//...
}
};
答案 1 :(得分:0)
您的第一个函数example
是一个可在整个JS程序中重用的命名函数。它具有全球范围。要使用它,您需要调用它,如下所示:
example(value1, value2);
这会将value1
和value2
发送到函数中,通常会使用这些值执行某些操作。函数通常会返回一个值。
第二个函数既是匿名函数又是回调函数。它是匿名的,因为它没有名称和回调,因为它只在事件发生时被调用。您几乎总是将这些函数与事件结合使用(例如click
,hover
等)。
一个很好的例子可能是您的方法是示例中thing
上的点击事件。当您的用户点击thing
时,匿名函数会被触发。范围不是全局的,它只能在可以访问的click事件内部。
// jQuery callback on a click event
$("#button-in-your-program").click(function() {
console.log("Your callback function worked");
});
与所有这些相关的另一个主题称为闭包。闭包是在调用函数时创建的词法范围。大多数时候你并没有真正考虑它。但是当你将一个函数嵌套在另一个函数中时,它就成了一个重要的概念。例如,当子函数在其父函数中引用变量时,闭包用于向子函数提供变量的值。