Javascript 在变量中声明函数的不同方式

Javascript 在变量中声明函数的不同方式,javascript,Javascript,我对以下两种在Javascript变量中声明函数的方法感到好奇。下面两个函数声明之间有什么区别?两者似乎都有效。使用一个比另一个有什么缺点吗?在查看调试器时,它们的构造似乎略有不同 此外,我相当确定第一种方法叫做“对象文字符号”。第二种方法有正式名称吗 var myVar = { testProperty: 'testProperty', // Object literal notation? testFunc: function() { con

我对以下两种在Javascript变量中声明函数的方法感到好奇。下面两个函数声明之间有什么区别?两者似乎都有效。使用一个比另一个有什么缺点吗?在查看调试器时,它们的构造似乎略有不同

此外,我相当确定第一种方法叫做“对象文字符号”。第二种方法有正式名称吗

var myVar = {
    testProperty: 'testProperty',

    // Object literal notation?
    testFunc: function()
    {
        console.log('testFunc called');
    },

    // What's this called? 'Named function declaration'?
    testFunc2()
    {
        console.log('testFunc2 called');
    }
}

// Both work...
myVar.testFunc();
myVar.testFunc2();

在(ObjectLiteral)中定义属性(PropertyDefinition)有多种方法:

  • “简单”属性定义​

  • 这包括ECMAScript 5添加的getter和setter

    get PropertyName[?Yield] ( ) { FunctionBody }
    set PropertyName[?Yield] ( PropertySetParameterList ) { FunctionBody }
    还有方法和生成器方法,由ECMAScript 6添加

    PropertyName[?Yield] ( StrictFormalParameters ) { FunctionBody }
    * PropertyName[?Yield] ( StrictFormalParameters[?Yield] ) { GeneratorBody }
    
    [ AssignmentExpression[In, ?Yield] ] : AssignmentExpression[In, ?Yield]
  • 属性定义​ 使用ECMAScript 6添加的计算属性名

    PropertyName[?Yield] ( StrictFormalParameters ) { FunctionBody }
    * PropertyName[?Yield] ( StrictFormalParameters[?Yield] ) { GeneratorBody }
    
    [ AssignmentExpression[In, ?Yield] ] : AssignmentExpression[In, ?Yield]
  • “速记”属性定义,由ES6添加

    IdentifierReference
它们具有不同的语法并提供不同的功能,但结果总是在结果对象中创建属性。在您的例子中,方法定义基本上与“简单”属性定义相同​ 其中AssignmentExpression是函数表达式。但是,使用后者,可以为函数指定自定义名称

也看到


如果在对象内声明函数,该函数称为对象的方法,但仍有被调用的函数,则可能应该使用第一个方法而不是第二个方法

为什么?第二种是完全有效的语法,而且更短。这就是它被引入的原因。“如果你在一个对象中声明一个函数”,我想你的意思是如果你把一个函数赋给一个对象属性。函数是如何创建的(声明或表达式)并不重要。标题可能应该是“将函数声明为对象文本中的属性”。@torazaburo,除了这里没有函数声明之外。;-)MDN链接特别有用。非常感谢。
[ AssignmentExpression[In, ?Yield] ] : AssignmentExpression[In, ?Yield]
var prop = "a",
    obj = {[prop]: 1};
obj.a; // 1
IdentifierReference
var a = 1,
    obj = {a};
obj.a; // 1