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
函数,以便稍后执行。 接收其他函数作为参数或返回其他函数作为结果的函数称为“高阶函数”