新手jQuery / Javascript问题
我看到以下列方式编写的函数:
some_function = function(event) {
}
我的问题是:event
论证是什么意思?它是可选的吗?如果我想要两个额外的参数X和Y,签名会是什么样子怎么办?当我现在调用该函数时,我可以像some_function();
一样调用它并且它工作正常(这使我相信它是可选的)。但是,当我有两个额外的参数如X和Y时,它会如何改变?我可以称之为some_function(myX, myY)
吗?
谢谢!
答案 0 :(得分:5)
有两种方法可以在JavaScript中实例化一个函数。它们看起来都一样,但它们的含义并不完全相同。
您发布的内容是函数实例化,作为语言中表达式的一部分。在该表单中,语法为
功能 名称 ( p1 , p2 ,... ) { 正文 }
“名称”和参数是可选的;关键字function
和括号是必需的。 (在这种情况下,在某些浏览器中使用名称存在一些模糊的问题;它不再是一个问题。)
这样做的效果是创建一个新的函数对象。对象的引用就像任何其他值一样参与表达式(好像任何其他对象的引用一样)。因为它是一个函数,所以引用也可以用来调用函数并使其代码(“body”)执行,就像你期望的那样。 (如果你做不到,那就没什么用了!)
函数可以实例化的另一种方式是使用函数声明语句,令人惊讶的是,完全相同(除了需要“name”)。不同之处在于代码中{4}出现在关键字function
的确切位置:
如果关键字function
是新语句中的第一件事,那么您有一个函数声明,并且需要“name”。在这种情况下,语句不 表达式语句,并且该语句唯一做的是实例化该函数并将对该函数的引用绑定到“name”或多或少好像“name”是一个局部变量(如果在全局范围内,则为全局变量)。
如果关键字function
出现在表达式的任何其他位置(表达式语句或隐藏在其他某个上下文中的表达式,如for
或{{1}的顶部} loop语句),然后它是一个函数实例化表达式。
现在,无论函数是如何“生成”的,一旦你有了对函数的引用,你可以调用它并传递任意数量的参数。
我个人不知道趋势是如何开始的,或者它是否应该被视为一种趋势,但是看到本地函数用这样的代码实例化(和你发布的内容一样)是相当普遍的:
while
这是表达式中函数实例化的一个示例。实际效果是符号“some_function”绑定到新创建的函数。然而,在名称与(几乎)等效函数声明绑定到函数的方式之间存在轻微的差异:
var some_function = function( arg1, arg2 ) {
/* some code */
};
第二种方式(函数声明语句)稍微好一点的一个简单原因是函数的名称将显示在堆栈跟踪中。当然,人们可以用冗余的方式实现这一目标:
function some_function( arg1, arg2 ) {
/* some code */
};
我真的不知道你为什么要那样做,但除了在some naughty environments之外它都有效。
答案 1 :(得分:1)
该代码段有点含糊不清,但一般来说,我可以回答您的问题。
您提供的代码中的event
参数正是该函数将用于引用从其他任何代码调用它传递给函数的第一个参数。例如,如果您的代码调用了some_function
函数,并将其传递给字符串"hello world!"
,则调用类似于:
obj.some_function("hello world!")
在some_function
函数内部,变量event
将包含"hello world!"
。此外,您可以将some_function
签名更改为:some_function(blah)
并且它们将完全相同,您只需使用blah
来引用参数而不是event
。您为参数选择的变量名称完全取决于您,但您要确保不使用语言保留名称(例如in
,for
,continue
,{{ 1}}等等)
从技术上讲,所有参数对于JavaScript函数都是可选的,除非函数的内部代码强制执行参数(例如,如果缺少参数,它可能会返回或抛出错误。
@Pointy回答了我要做的另一点......你提供的代码是将该函数定义为表达式。当我创建一个作为对象属性的函数时,我会使用该语法(这就是我上面的代码在开头有break
的原因。