4

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

在我的 init 方法中,请使用 .on 方法查看这一特定行.

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

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

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

我说的对吗,因为我们不想立即调用 show 方法,如果 JavaScript 遇到 init 方法会解析所有这些代码,然后它会在这里来到本节this.show() ——它会立即执行这个功能。但我不希望它这样做,我只希望在单击相应按钮的条件下调用该函数。

当 show 方法写成this.show没有括号时,是否会阻止 show 方法自动执行?

var contactForm = {
        init: function() {
            $('<button></button>', {    
                text: 'Contact Me!'  
            }) 
                .insertAfter('article:first')
                .on( 'click', this.show() );
        },

        show: function() {
            console.log('showing');
        }

抱歉,如果我的术语描述不够准确或不够准确。任何简洁明了的答案将不胜感激。

4

2 回答 2

8

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

似乎您将不带括号的函数名称视为某种特殊情况,但实际上,情况恰恰相反。

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

运营商

()是一个常规运算符,-例如,它否定一个值。运算符总是应用于值:-5否定 value 5-(-5)否定表达式(-5)which is 5again。

()另一方面,尝试将其左侧的表达式作为函数调用: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没有()是需要单独处理的特殊情况,但事实并非如此。这就像说“-5 比 5 更正常”,并且没有-使某些东西成为正数。然而,它是相反的:5是“默认”,如果你愿意-5的话,以及特殊情况。这与show.

将此应用于您的示例

on()函数期望得到某种回调,即一个函数。如果你通过show()了,你在通过什么?评估的表达式show()。这是什么?当然,无论show()返回什么。因此,on()“不知道”您已经show()show().

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

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

于 2012-10-05T10:49:28.920 回答
1

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

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

于 2012-10-05T10:26:07.370 回答