-3

定义 javascript 函数有不同的方法。我经常用最简单的方式来定义函数

function myfunc(){
}

以及像这样在变量中定义函数的下一种方式(使用方式有点混乱)

var myvar = myfunc(){
/*some code*/
}

以及对我来说困难的方式,主要是在高级程序员开发的代码中,如下所示

var SqueezeBox={presets:{onOpen:function(){},onClose:function(){}}

拜托,任何人都可以清除我对此的概念,我该如何使用?

4

5 回答 5

3
function myfunc(){}

函数声明:使用标准语法声明函数

function functionName(params[]) {
    //functionbody
}

使用此语法在作用域执行开始时声明函数,因此它们将在其作用域(及其后代作用域)的任何地方可用。

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 文档。无论如何,如果你真的对 JS 的工作原理感兴趣,我会推荐Javascript Garden,这是一篇关于 JS 的非常好的文章。

于 2013-09-27T07:37:30.843 回答
1

第一个代码片段是一个函数声明

function myfunc() { }

您正在声明一个名为functioncalled myfunc。您可以通过以下方式验证这一点myfunc.name === "myfunc"

您的第二个代码段包含语法错误。我相信你的意思是:

var myvar = function() { };

这是分配给变量的匿名函数表达式。您可以通过和来验证这一点。typeof myvar === "function"myvar.name === ""

第三个片段是一个 javascript 对象。基本上你可以把它想象成一个Mapor Dictionary<string, object>。SoSqueezeBox包含 1 个 key presets,它又是一个包含 2 个 key 的字典,onOpen并且onClose,它们都是匿名函数

于 2013-09-27T07:37:04.327 回答
0

这里有很多关于这个主题的有用信息

函数可以有一个名称,如果指定,则不能更改。函数也可以像 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() {};
于 2013-09-27T07:55:55.447 回答
0

var SqueezeBox={presets:{onOpen:function(){},onClose:function(){}}}

他正在创建一个对象,该对象SqueezeBox包含另一个presets具有两个空匿名函数的对象,他在{}. 一种更好的查看方式是这样格式化的:

  var SqueezeBox={
                  presets:{
                           onOpen:function(){/* empty function body */},
                           onClose:function(){/*empty function body */}
                          }
                  }
于 2013-09-27T07:27:15.173 回答
0

这已经在这里得到了回答:Javascript中的函数表达式与声明有什么区别?.

对于最后一个示例,正如 Atropo 所说,它正在影响对象的匿名函数。它与var示例类似。

于 2013-09-27T07:34:22.253 回答