左值表达式

2018-06-16 15:18 更新

语法:

MemberExpression : PrimaryExpression FunctionExpression MemberExpression [ Expression ] MemberExpression . IdentifierName new MemberExpression ArgumentsNewExpression : MemberExpression new NewExpressionCallExpression : MemberExpression Arguments CallExpression Arguments CallExpression [ Expression ] CallExpression . IdentifierNameArguments : ( ) ( ArgumentList )ArgumentList : AssignmentExpression ArgumentList , AssignmentExpressionLeftHandSideExpression : NewExpression CallExpression

属性访问

 属性是通过 name 来访问的,可以使用点表示法访问

MemberExpression . IdentifierName CallExpression . IdentifierName

 或者括号表示法访问

MemberExpression [ Expression ] CallExpression [ Expression ]

 点表示法是根据以下的语法转换解释

MemberExpression . IdentifierName

 这会等同于下面这个行为

MemberExpression [ <identifier-name-string> ]

 类似地,

CallExpression . IdentifierName

 是等同于下面的行为

CallExpression [ <identifier-name-string> ]

 是一个字符串字面量,它与 Unicode 编码后的 IdentifierName 包含相同的字符序列。

 产生式 MemberExpression : MemberExpression [ Expression ] is evaluated as follows:

  1. 令 baseReference 为解释执行 MemberExpression 的结果 .
  2. 令 baseValue 为 GetValue(baseReference).
  3. 令 propertyNameReference 为解释执行 Expression 的结果 .
  4. 令 propertyNameValue 为 GetValue(propertyNameReference).
  5. 调用 CheckObjectCoercible(baseValue).
  6. 令 propertyNameString 为 ToString(propertyNameValue).
  7. 如果正在执行中的语法产生式包含在严格模式代码当中,令 strict 为 true, 否则令 strict 为 false.
  8. 返回一个值类型的引用,其基值为 baseValue 且其引用名为 propertyNameString, 严格模式标记为 strict.

 产生式CallExpression : CallExpression [ Expression ] 以完全相同的方式执行,除了第1步执行的是其中的CallExpression。

new 运算符

 产生式 NewExpression : new NewExpression 按照下面的过程执行 :

  1. 令 ref 为解释执行 NewExpression 的结果 .
  2. 令 constructor 为 GetValue(ref).
  3. 如果 Type(constructor) is not Object ,抛出一个 TypeError 异常 .
  4. 如果 constructor 没有实现 [[Construct]] 内置方法 ,抛出一个 TypeError 异常 .
  5. 返回调用 constructor 的 [[Construct]] 内置方法的结果 , 传入按无参数传入参数列表 ( 就是一个空的参数列表 ).

 产生式 MemberExpression : new MemberExpression Arguments 按照下面的过程执行 :

  1. 令 ref 为解释执行 MemberExpression 的结果 .
  2. 令 constructor 为 GetValue(ref).
  3. 令 argList 为解释执行 Arguments 的结果 , 产生一个由参数值构成的内部列表类型 (11.2.4).
  4. 如果 Type(constructor) is not Object ,抛出一个 TypeError 异常 .
  5. 如果 constructor 没有实现 [[Construct]] 内置方法,抛出一个 TypeError 异常 .
  6. 返回以 argList 为参数调用 constructor 的 [[Construct]] 内置方法的结果。

函数调用

 产生式 CallExpression : MemberExpression Arguments 按照下面的过程执行 :

  1. 令 ref 为解释执行 MemberExpression 的结果 .
  2. 令 func 为 GetValue(ref).
  3. 令 argList 为解释执行 Arguments 的结果 , 产生参数值们的内部列表 (see 11.2.4).
  4. 如果 Type(func) is not Object ,抛出一个 TypeError 异常 .
  5. 如果 IsCallable(func) is false ,抛出一个 TypeError 异常 .
  6. 如果 Type(ref) 为 Reference,那么 如果 IsPropertyReference(ref) 为 true,那么 令 thisValue 为 GetBase(ref). 否则 , ref 的基值是一个环境记录项 令 thisValue 为调用 GetBase(ref) 的 ImplicitThisValue 具体方法的结果
  7. 否则 , 假如 Type(ref) 不是 Reference. 令 thisValue 为 undefined.
  8. 返回调用 func 的 [[Call]] 内置方法的结果 , 传入 thisValue 作为 this 值和列表 argList 作为参数列表

 产生式 CallExpression : CallExpression Arguments以完全相同的方式执行,除了第1步执行的是其中的CallExpression。

 假如func是一个原生的ECMAScript对象,返回的结果永远不会是Reference类型,调用一个宿主对象是否返回一个Reference类型的值由实现决定。 若一Reference值返回,则它必须是一个非严格的属性引用。

参数列表

 The evaluation of an argument list produces a List of values (see 8.8).

 产生式 Arguments : ( ) 按照下面的过程执行 :

  1. 返回一个空列表 .

 产生式 Arguments : ( ArgumentList ) 按照下面的过程执行 :

  1. 返回解释执行 ArgumentList 的结果 .

 产生式 ArgumentList ':' AssignmentExpression 按照下面的过程执行 :

  1. 令 ref 为解释执行 AssignmentExpression 的结果 .
  2. 令 arg 为 GetValue(ref).
  3. 返回 a List whose sole item is arg.

 产生式 ArgumentList :'''' ArgumentList , AssignmentExpression 按照下面的过程执行 :

  1. 令 precedingArgs 为解释执行 ArgumentList 的结果 .
  2. 令 ref 为解释执行 AssignmentExpression 的结果 .
  3. 令 arg 为 GetValue(ref).
  4. 返回一个列表,长度比 precedingArgs 大 1 且 它的 items 为 precedingArgs 的 items, 按顺序在后面跟 arg,arg 是这个新的列表的最后一个 item.

函数表达式

 产生式 MemberExpression : FunctionExpression 按照下面的过程执行 :

  1. 返回解释执行 FunctionExpression 的结果 .


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号