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

时间:2016-02-15 02:41:47

标签: javascript

我很好奇以下两种在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();

2 个答案:

答案 0 :(得分:5)

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

  • A"简单" PropertyDefinition

    PropertyName[?Yield] : AssignmentExpression[In, ?Yield]

    例如:

    var obj = {a: 1};
    obj.a; // 1
    
  • Method definitions

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

    get PropertyName[?Yield] ( ) { FunctionBody }
    set PropertyName[?Yield] ( PropertySetParameterList ) { FunctionBody }

    例如:

    var obj = {n: 0, get a() { return ++obj.n; }};
    obj.a; // 1
    obj.a; // 2
    

    以及ECMAScript 6添加的方法和生成器方法

    PropertyName[?Yield] ( StrictFormalParameters ) { FunctionBody }
    * PropertyName[?Yield] ( StrictFormalParameters[?Yield] ) { GeneratorBody }
    

    例如:

    var obj = {a(n) { return 2*n; }};
    obj.a(1); // 2
    obj.a(2); // 4
    
  • 使用ECMAScript 6添加的计算属性名称
  • PropertyDefinition

    [ AssignmentExpression[In, ?Yield] ] : AssignmentExpression[In, ?Yield]

    例如:

    var prop = "a",
        obj = {[prop]: 1};
    obj.a; // 1
    
  • "速记" PropertyDefinition ,由ES6添加

    IdentifierReference

    例如:

    var a = 1,
        obj = {a};
    obj.a; // 1
    

它们具有不同的语法并提供不同的功能,但结果始终是在结果对象中创建属性。在您的情况下,方法定义基本上与"简单"相同。 PropertyDefinition 其中 AssignmentExpression 是一个函数表达式。但是,使用后者,您可以为函数指定自定义名称。

另见

答案 1 :(得分:0)

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