这两个javascript函数到底有什么区别

What exactly is the difference between these two javascript functions?

本文关键字:什么 区别 函数 javascript 两个      更新时间:2023-09-26

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

我可能误解了一些事情。有人能帮我收拾一下吗?

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);
        //...
    }
};

您的第一个函数example是一个命名函数,可在整个JS程序中重复使用。它具有全球性。要使用它,你需要这样称呼它:

example(value1, value2);

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

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

一个很好的例子可能是,在您的例子中,您的方法是thing上的一个点击事件。当您的用户单击thing时,将启动匿名函数。作用域不是全局的,只有在单击事件内部才能访问它。

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

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