我很好奇以下两种在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();
答案 0 :(得分:5)
有多种方法可以在object initializer( ObjectLiteral )中定义属性( PropertyDefinition ):
A"简单" PropertyDefinition
PropertyName[?Yield] : AssignmentExpression[In, ?Yield]
例如:
var obj = {a: 1};
obj.a; // 1
这包括由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
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)
如果在对象内部声明一个函数,该函数被称为对象的方法,但仍有被调用的函数,你应该使用第一种方法而不是使用第二种方法