您好,我有一个问题,我需要一些帮助,以增加我对JavaScript的了解和理解。
在我的init方法中,请使用.on方法查看此特定行,我说当单击按钮时我们将使用this关键字引用contactForm对象,然后我们将调用.show方法。
.on( 'click', this.show );
现在问题是 - 如果show是一个方法,那么为什么我们不这样做,为什么我们不调用这样的方法?
.on( 'click', this.show() );
我说的是正确的,因为我们不想立即调用show方法,如果遇到JavaScript的方法会解析所有这些代码,那么它会在这里进入这一部分 - {{1 - 它将立即执行此功能。但我不希望它这样做,我只希望在单击相应按钮的条件下调用该函数。
当show方法写为this.show()
时,是否缺少括号会阻止show方法自动执行?
this.show
很抱歉,如果我的术语描述不够或不够准确。任何简洁明了的答案都会受到大力赞赏。
答案 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}}是一个特殊情况需要单独处理,但事实并非如此。这就像说" -5比5"更正常。而()
的缺席使得一些正数。反过来说:-
是"默认",如果你愿意,5
是特殊情况。 -5
与<{1}}相同。
show
函数期望得到某种回调,即函数。如果你通过on()
,你还在路过什么?评估表达式show()
。这是什么?当然,无论show()
返回什么。因此,show()
已经不知道&#34;你已经使用on()
做了一些事情,只要没有与show()
的连接,它就会获得一些价值。
当然,show()
函数本身可能返回一个函数,因为正如我们所知,函数只是可以传递的值show()
和5
。
在这种情况下,"foo"
函数仍然被传递一个函数,该函数将在相应的事件中被调用。
答案 1 :(得分:1)
你是对的。当您在不添加括号的情况下引用方法(或任何函数)时,运行时会将其解释为函数引用。
因此,在您的示例中,您有效地将show
函数传递给on
函数,以便稍后执行。接收其他函数作为参数或将其他函数作为结果返回的函数称为“高阶函数”