2

新手 jQuery / Javascript 问题在这里

我看到以以下方式编写的函数:

some_function = function(event) {

}

我的问题是:这个event论点是什么意思?它是可选的吗?如果我想要两个额外的参数 X 和 Y,签名会是什么样子?当我现在调用该函数时,我可以直接调用它some_function();并且它工作正常(这让我相信它是可选的)。但是,当我有两个额外的参数(如 X 和 Y)时,情况会如何变化?我可以这样称呼它some_function(myX, myY)吗?

谢谢!

4

2 回答 2

5

有两种方法可以在 JavaScript 中实例化函数。它们看起来一样,但它们的含义并不完全相同。

您发布的是作为语言表达式一部分的函数实例化。在这种形式下,语法是

函数 ( p1 , p2 , ... ) { body }

“名称”和参数是可选的;关键字function和括号是必需的。(在这种情况下,在某些浏览器中使用名称存在一些晦涩难懂的问题;问题越来越少了。)

这样做的效果是创建一个新的函数对象。对对象的引用就像任何其他值一样参与到表达式中(嗯,就像对对象的任何其他引用一样)。因为它是一个函数,所以引用也可用于调用函数并使其代码(“主体”)执行,就像您所期望的那样。(如果你不能,它就不会是一个很大的功能!)

可以实例化函数的另一种方法是使用函数声明语句,令人惊讶的是,它看起来完全一样(除了需要“名称”)。不同之处在于关键字function出现在代码中的确切位置:

  • 如果关键字function是新语句中的第一件事,那么你有一个函数声明并且“名称”是必需的。在这种情况下,该语句不是表达式语句,并且该语句唯一要做的就是实例化函数并将对该函数的引用绑定到“name”或多或少,就好像“name”是一个局部变量(或 global if in全局范围)。

  • 如果关键字function出现在表达式中的任何其他位置(表达式语句,或者埋在其他上下文中的表达式,例如forwhile循环语句的顶部),那么它就是函数实例化表达式。

现在,不管函数是如何“诞生”的,一旦你获得了对该函数的引用,你就可以调用它并传递任意数量的参数。


我个人不知道这种趋势是如何开始的,或者它是否应该被视为一种趋势,但是看到用这样的代码实例化的本地函数是相当普遍的(就像你发布的那样):

var some_function = function( arg1, arg2 ) {
  /* some code */
};

这是表达式中函数实例化的示例。最终效果是符号“some_function”绑定到新创建的函数。但是,名称与(几乎)等效函数声明中的函数绑定的方式之间存在细微的差异:

function some_function( arg1, arg2 ) {
  /* some code */
};

第二种方式(函数声明语句)更好一点的一个简单原因是函数的名称将显示在堆栈跟踪中。当然,可以通过冗余外观来实现:

var some_function = function some_function( arg1, arg2 ) {
  /* some function */
};

我真的不知道您为什么要这样做,但它会起作用,除非在一些顽皮的环境中

于 2013-05-07T19:25:56.847 回答
1

该代码段有点模糊,但是我可以回答您的问题。

您提供的代码中的event参数正是该函数将用来引用从其他代码调用它传递给函数的第一个参数的参数。例如,如果你有调用你的some_function函数的代码,并传递给它一个 string "hello world!",调用看起来像这样:

obj.some_function("hello world!")

some_function函数内部,变量event将包含"hello world!". 此外,您可以将您的some_function签名更改为:some_function(blah)并且都是一样的,您只需使用blah来引用参数而不是event. 您为参数选择的变量名称完全取决于您,但您要确保不使用语言保留的名称(如inforcontinuebreak等)

从技术上讲,JavaScript 函数的所有参数都是可选的,除非函数的内部代码强制执行参数(即,如果缺少参数,它可能会返回或抛出错误。

@Pointy 回答了我要提出的另一点……您提供的代码将该函数定义为表达式。当我创建一个作为对象属性的函数时,我使用该语法(这就是为什么我上面的代码obj.在开头有。

于 2013-05-07T19:29:25.800 回答