JavaScript方法,没有括号的调用方法

您好,我有一个问题,我需要一些帮助,以增加我对JavaScript的知识和理解。

在我的init方法中,请使用.on方法查看这个特定的行,我说当单击按钮时我们将使用this关键字引用contactForm对象,然后我们将调用.show方法。

.on( 'click', this.show ); 

现在的问题是 – 如果show是一个方法,那么为什么我们不这样做,为什么我们不调用这样的方法?

  .on( 'click', this.show() ); 

我说的是正确的,因为我们不想立即调用show方法,如果遇到JavaScript方法会解析所有这些代码,那么它会在这里来到这一部分 – this.show() -它会立即执行此function。 但我不希望它这样做,我只希望在单击相应按钮的条件下调用该函数。

当show方法写成this.show是否缺少括号会阻止show方法自动执行?

 var contactForm = { init: function() { $('', { text: 'Contact Me!' }) .insertAfter('article:first') .on( 'click', this.show() ); }, show: function() { console.log('showing'); } 

对不起,如果我的术语不够具有足够的描述性或准确性。 任何简洁明了的答案都会受到大力赞赏。

是的,你所描述的是正确的,然而,你正在以错误的方式看待它。

看来,好像你认为没有括号的函数名称是某种特殊情况,但实际上,它是另一种方式。

了解表达式和运算符的概念非常重要。

运营商

()是一个常规运算符,例如,它取消了一个值。 运算符总是应用于值: -5否定值5-(-5)否定表达式(-5) ,再次为5

另一方面, ()尝试将表达式调用到其左侧作为函数: expr()

function是价值

JavaScript中的函数是您可以传递的值,就像您可以使用值5

 var five = 5; var returnFive = function() { return 5; }; var five2 = five; var returnFive2 = returnFive; alert(five2); alert(returnFive2()); 

实际上没有更多内容:函数只是值,恰好支持一些“调用”它们的特殊magical ()运算符。

出于这个原因,做任何一个都是完全有效的

  • show()
  • (show)()
  • ((show))()

等等,因为(expr)只是评估到expr

评估表达式

运算符采用一个或多个值,对其进行操作,并产生一些其他值:

 4 // No operator, expression evaluates to 4 4 + 4 // This expression evaluates to 8 returnFive // No operator, expression evalutes to the function value -5 // Unary operator, takes one value, negates it returnFive() // call operator, executes the function, evaluates to its return value 

我希望你从中得到的是,函数并不那么特别, show和那对括号之间没有内在的联系。

当show方法写成this.show是否缺少括号会阻止show方法自动执行?

是和否 – 这表明没有() show是一个特殊情况需要单独处理,但事实并非如此。 这就像说“-5比5更正常”而缺席-使得某些东西成为正数。 反过来说,如果你愿意, 5是“默认”,特殊情况是-5 。 这与show是一回事。

将此应用于您的示例

on()函数期望得到某种回调,即函数。 如果你传递show() ,你传递了什么? 评估的表达式show() 。 这是什么? 当然,无论show()返回什么。 因此, on() “不知道”你已经用show()做了一些事情,它得到的只是一些没有show()连接的值。

当然, show()函数本身可能会返回一个函数,因为正如我们所知,函数只是像5"foo"这样的值可以传递。

在这种情况下, on()函数仍然被传递一个函数,该函数将在相应的事件上被调用。

你是对的。 当您在不添加括号的情况下引用方法(或任何函数)时,运行时会将其解释为函数引用。

因此,在您的示例中,您实际上是将show函数传递给on函数,以便稍后执行。 接收其他函数作为参数或返回其他函数作为结果的函数称为“高阶函数”