定义javascript函数有不同的方法。我经常使用最简单的方法来定义函数
function myfunc(){
}
以及在此变量中定义函数的下一种方法(有点混淆使用方式)
var myvar = myfunc(){
/*some code*/
}
对我来说很困难,主要是在高级程序员开发的代码中找到,如下所示
var SqueezeBox={presets:{onOpen:function(){},onClose:function(){}}
拜托,任何人都可以清楚我的概念吗?
答案 0 :(得分:3)
function myfunc(){}
函数声明:使用标准语法
声明函数function functionName(params[]) {
//functionbody
}
使用此语法在范围执行开始时声明函数,因此它们将在其范围内(以及它们的descendeant范围内)的所有位置都可用。
var s = myfunc(); //s == 0
function myfunc() {return 0;}
var myfunc = function() {};
这使用称为函数表达式的模式,它只是将匿名函数的引用分配给名为myfunc
的变量。使用此语法将不允许您在解析变量之前使用该函数。即使变量在其范围的顶部被提升,它们也会在解释器解析它们时被初始化,因此上面的示例将不起作用:
var s = myfunc(); //ReferenceError: myfunc is not defined
var myfunc = function() {return 0;};
但下面的例子将是:
var myfunc = function() {return 0;};
var s = myfunc(); //s == 0
第三个例子就是以我们刚刚用函数表达式完成的方式为对象属性(也称为对象方法)分配一个匿名函数,所以如果我使用上面的模式代码将变为:
var onOpen = function() {},
onClose = function() {},
SqueezeBox = {//curly braces denotes an object literal
presets: {//again, this is a nested object literal
onOpen: onOpen,
onClose: onClose
}
};
这与您的示例完全相同,唯一的区别是我在使用变量来获取对匿名函数的引用然后将其传递给对象。如果您需要了解有关对象的更多信息,建议您阅读MDN docs。无论如何,如果你真的对JS的工作方式感兴趣,我建议Javascript Garden,这是一篇关于JS的非常好的文章。
答案 1 :(得分:1)
第一个代码段是函数声明:
function myfunc() { }
您要声明名为function
的{{1}}。您可以myfunc
您的第二个代码段包含语法错误。我相信你的意思是:
myfunc.name === "myfunc"
这是分配给变量的匿名函数表达式。您可以var myvar = function() { };
和typeof myvar === "function"
验证这一点。
第三个片段是一个javascript对象。基本上,您可以将其视为myvar.name === ""
或Map
。因此,Dictionary<string, object>
包含1个密钥SqueezeBox
,后者又是包含2个密钥的字典,presets
和onOpen
,这两个密钥都是匿名函数强>
答案 2 :(得分:0)
在
var SqueezeBox={presets:{onOpen:function(){},onClose:function(){}}}
他正在创建一个包含另一个对象SqueezeBox
的对象presets
,其中包含两个空的匿名函数,他在{}
内定义了一个内联空函数的函数。
查看它的更好方法是这样格式化:
var SqueezeBox={
presets:{
onOpen:function(){/* empty function body */},
onClose:function(){/*empty function body */}
}
}
答案 3 :(得分:0)
这已在此处得到解答:What is the difference between a function expression vs declaration in Javascript?。
对于最后一个例子,正如Atropo所说,它正在影响一个对象的匿名函数。它类似于var
示例。
答案 4 :(得分:0)
有关此主题的许多有用信息here
函数可以有一个名称,如果指定则不能更改。函数也可以像javascript中的任何其他对象一样分配给变量。
第一个例子是函数声明:
function myfunc(){
}
使用函数声明,您将能够在声明函数的闭包内的任何位置调用该函数,即使它是在使用它之后声明的。
另外两个例子是函数表达式:
var myvar = function(){
/*some code*/
}
var SqueezeBox= {
presets: {
onOpen:function(){/* empty function body */},
onClose:function(){/*empty function body */}
}
}
使用函数表达式将函数赋值给变量。执行此操作时,必须在使用它们之前声明它们。大多数情况下,您会看到这些函数是匿名的,但可以在表达式中命名函数:
var myvar = function myFunc(){
myFunc(); // Because it has a name you can now call it recursively
}
执行此操作时,myFunc
函数仅在函数体内可用,因为它仍然是函数表达式而不是声明。
第三个示例声明了一个javascript对象文字SqueezeBox
,在该对象中还有一个名为presets
的对象。在此对象中,还有两个名为onOpen
和onClose
的对象/标签。这意味着您可以执行以下操作来使用这些功能:
SqueezeBox.presets.onOpen();
SqueezeBox.presets.onClose();
您可以将onOpen和onClose视为属于对象的变量。所以它与执行以下操作非常相似(但该变量仅在presets
对象的范围内,该对象仅在SqueezeBox
对象中可用。)
var onOpen = function() {};