我很好奇以下两种在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();
Run Code Online (Sandbox Code Playgroud)
有多种方法可以在对象初始值设定项(ObjectLiteral)中定义属性(PropertyDefinition):
"简单" PropertyDefinition
PropertyName[?Yield] : AssignmentExpression[In, ?Yield]Run Code Online (Sandbox Code Playgroud)
例如:
var obj = {a: 1};
obj.a; // 1
Run Code Online (Sandbox Code Playgroud)这包括由ECMAScript 5添加的getter和setter
get PropertyName[?Yield] ( ) { FunctionBody }
set PropertyName[?Yield] ( PropertySetParameterList ) { FunctionBody }Run Code Online (Sandbox Code Playgroud)
例如:
var obj = {n: 0, get a() { return ++obj.n; }};
obj.a; // 1
obj.a; // 2
Run Code Online (Sandbox Code Playgroud)
以及ECMAScript 6添加的方法和生成器方法
PropertyName[?Yield] ( StrictFormalParameters ) { FunctionBody }
* PropertyName[?Yield] ( StrictFormalParameters[?Yield] ) { GeneratorBody }
Run Code Online (Sandbox Code Playgroud)
例如:
var obj = {a(n) { return 2*n; }};
obj.a(1); // 2
obj.a(2); // 4
Run Code Online (Sandbox Code Playgroud)使用计算属性名称的PropertyDefinition,由ECMAScript 6添加
[ AssignmentExpression[In, ?Yield] ] : AssignmentExpression[In, ?Yield]Run Code Online (Sandbox Code Playgroud)
例如:
var prop = "a",
obj = {[prop]: 1};
obj.a; // 1
Run Code Online (Sandbox Code Playgroud)"速记" 属性定义,由ES6添加
IdentifierReferenceRun Code Online (Sandbox Code Playgroud)
例如:
var a = 1,
obj = {a};
obj.a; // 1
Run Code Online (Sandbox Code Playgroud)它们具有不同的语法并提供不同的功能,但结果始终是在结果对象中创建属性.在你的情况中,一种方法的定义是基本相同"简单" PropertyDefinition其中AssignmentExpression函数式.但是,使用后者可以为函数指定自定义名称.
另见
| 归档时间: |
|
| 查看次数: |
70 次 |
| 最近记录: |