这两个javascript函数究竟有什么区别?

时间:2016-08-26 12:48:38

标签: javascript

我在尝试学习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));

我可能误解了一些事情。那个人能为我清理一下吗?

2 个答案:

答案 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);

这会将value1value2发送到函数中,通常会使用这些值执行某些操作。函数通常会返回一个值。

第二个函数既是匿名函数又是回调函数。它是匿名的,因为它没有名称和回调,因为它只在事件发生时被调用。您几乎总是将这些函数与事件结合使用(例如clickhover等)。

一个很好的例子可能是您的方法是示例中thing上的点击事件。当您的用户点击thing时,匿名函数会被触发。范围不是全局的,它只能在可以访问的click事件内部。

// jQuery callback on a click event
$("#button-in-your-program").click(function() {
  console.log("Your callback function worked");
});

与所有这些相关的另一个主题称为闭包。闭包是在调用函数时创建的词法范围。大多数时候你并没有真正考虑它。但是当你将一个函数嵌套在另一个函数中时,它就成了一个重要的概念。例如,当子函数在其父函数中引用变量时,闭包用于向子函数提供变量的值。