为什么这里需要一个更复杂的jQuery模式?

时间:2014-10-22 06:02:45

标签: javascript

对我而言,以下代码似乎足够合理:

$("#oneButton").click(
    alert("hello");
); 

似乎说当点击OneButton时,请弹出一个警告“hello”。

然而,实际上,无论是否点击该按钮,都会弹出警告。

必须将alert("hello");包装在匿名函数中,然后(然后才会),弹出的警报将取决于单击按钮。对我来说,这似乎是不必要的错综复杂的。

jQuery的设计者必须有充分的理由认为即使没有点击按钮,上面的代码中的警报也可以弹出。这是什么原因?

4 个答案:

答案 0 :(得分:5)

公平的问题我猜,虽然我不喜欢随之而来的傲慢:)

让我们稍微打破一下:

object.method(function() {
    alert('hi');
});

您的问题是,为什么我不能跳过匿名函数?

我们在这里真正做的是告诉method稍后执行某些事情。正在执行的内容正在作为一项功能提供。

我们可以简单地给它一个函数的引用!

object.method(alert);

问题在于,我们已向其发送了一项功能,但现在我们无法发送任何参数。如果我们想将文件带到method,我们必须使用()

只要包含这些字符,alert就会被执行,而alert的结果会被发送到method

现在为什么这也可以通过引用发送?一个非常简单的原因,您需要一些方式将函数的结果作为参数传递给另一个函数,并且javascript引擎无法区分您的意图是否:

  • 将函数的结果作为参数发送给另一个函数,或者
  • 使用其他函数的某些参数发送对该函数的引用。

在函数上使用()意味着几乎每种编程语言都会立即调用它,而javascript也没有什么不同。

有一种解决方法:

object.method(alert.bind(this, "hi"));

答案 1 :(得分:0)

问题是Javascript没有宏(具有Lisp的含义)以及提供"代码的唯一方法"函数是通过传递一个函数/闭包对象。

click只是一个常规方法,接受的参数是" code"单击按钮时执行。但是对于任何参数,传递给click的表达式在进行调用时进行评估,而不是在用户单击按钮时进行评估。 要让click按照您的意愿工作,语法应该以不同于其他函数调用的方式处理click,这是Lisp中允许使用宏而不是函数。 Javascript没有宏,语法是用语言修复的:它没有click特殊格式,你不能创建一个。

情况并不是那么糟糕,因为Javascript语法允许内联匿名函数,所以基本上你只需要包装你的"代码"在呼叫站点使用function(){...}的参数使其正常工作。

在Python中,例如事情有点烦人,因为只能通过内联指定极其简单的函数,因为lambda形式可用于指定匿名内联函数但有严重的局限性并且不允许任何声明,但只是一个表达式。

答案 2 :(得分:0)

因为.click()是一个函数,它可能需要/某些参数/ s才能正确使用。

.click()只会触发事件。

.click(parameter)会在事件触发后执行参数中的操作。在这种情况下,parameter是一个回调函数,即在main函数完成后调用的函数。 但是对于要调用的回调,您必须创建一个函数。

通过命名一个:

function alertThis(){
   alert('hello');
}

$("#oneButton").click(alertThis);

或者:

$("#oneButton").click(function(){
   alert('hello');
});

答案 3 :(得分:0)

该语言只能为函数提供一个不那么详细的语法(查看coffeescript),但是库函数可以立即执行,因此您可以将它们包装起来并在需要时传递代码。

你有什么建议?我只能想到一种替代方法,其中原始API将自己返回一个函数,但是当您需要组合多个基元时(即使语言具有直接语法支持),这将导致更加丑陋的代码:

$(btn).onClick(alert().andThen(blink()).andThen(log()));

你也会被迫打电话

alert()()

当您需要立即显示对话框时。