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

时间:2012-10-05 10:14:07

标签: javascript jquery

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

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

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

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

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

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

当show方法写为this.show()时,是否缺少括号会阻止show方法自动执行?

this.show

很抱歉,如果我的术语描述不够或不够准确。任何简洁明了的答案都会受到大力赞赏。

2 个答案:

答案 0 :(得分:8)

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

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

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

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

另一方面,

()尝试将表达式作为函数调用到左侧:expr()

函数是值

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

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

实际上没有什么比这更重要了:函数只是值,恰好支持一些特殊的神奇()运算符"调用"它们。

出于这个原因,完成任何

都是完全有效的
  • 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的{​​{1}}是一个特殊情况需要单独处理,但事实并非如此。这就像说&#34; -5比5&#34;更正常。而()的缺席使得一些正数。反过来说:-是&#34;默认&#34;,如果你愿意,5是特殊情况。 -5与<{1}}相同。

将此应用于您的示例

show函数期望得到某种回调,即函数。如果你通过on(),你还在路过什么?评估表达式show()。这是什么?当然,无论show()返回什么。因此,show()已经不知道&#34;你已经使用on()做了一些事情,只要没有与show()的连接,它就会获得一些价值。

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

在这种情况下,"foo"函数仍然被传递一个函数,该函数将在相应的事件中被调用。

答案 1 :(得分:1)

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

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