10.2 源代码类型

这里有4种源代码类型

  • 全局代码被当作ECMAScript脚本。全局代码是一种特别的脚本,其不包含会被解析为以下一部分的源文本: FunctionDeclaration, FunctionExpression, GeneratorDeclaration, GeneratorExpression, MethodDefinition, ArrowFunction, ClassDeclaration, 或者 ClassExpression.
  • Eval代码是提供给内置的eval函数的。更准确的说,如果内置eval函数的参数是一个字符串,那么它会被当作一段ECMAScript脚本。调用eval函数的代码是全局代码的一部分。
  • 函数代码是提供给ECMAScript函数对象的内部属性:[[ECMAScriptCode]]和[[FormalParameters]]的。一个特定的ECMAScript函数代码不包含会被解析为嵌套的 FunctionDeclaration, FunctionExpression, GeneratorDeclaration, GeneratorExpression, MethodDefinition, ArrowFunction, ClassDeclaration, 或者 ClassExpression的源文本。
  • 模块代码是提供给ModuleBody的源文本。当module初始化时会直接执行。一个特定的模块代码不包含会被解析为嵌套的 FunctionDeclaration, FunctionExpression, GeneratorDeclaration, GeneratorExpression, MethodDefinition, ArrowFunction, ClassDeclaration, 或者 ClassExpression中的源文本。

注意:函数代码一般是当作函数定义、箭头函数定义、方法定义、Generator定义的body部分。也可以从Function构造函数和GeneratorFunction构造函数的参数派生而来。

10.2.1 严格模式代码

一个ECMAScript脚本语法单元要么以严格模式执行,要么以非严格模式执行。如下情形会以严格模式执行:

  • 全局代码以指令序言开头并且包含使用严格模式指令
  • 模块代码总是严格模式代码
  • 所有ClassDeclaration和ClassExpression都是严格模式
  • Eval代码以指令序言开头并且包含使用严格模式指令或者直接调用eval的代码是严格模式代码
  • 函数代码中,如果其关联的FunctionDeclaration, FunctionExpression, GeneratorDeclaration, GeneratorExpression, MethodDefinition, or ArrowFunction 是在严格模式中,或者其 [[ECMAScriptCode]] 内部属性以指令序言开头并且包含使用严格模式指令
  • 提供给FunctionGenerator构造函数的最后一个参数是字符串,并且处理成函数体时,以指令序言开头并且包含使用严格模式指令,那这个函数代码是严格模式。

非严格模式的ECMAScript代码称为non-strict代码

10.2.2 非ECMAScript函数

一个ECMAScript实现可能支持执行一些由可执行代码定义而不是由ECMAScript代码定义的函数对象。一个函数对象是ECMAScript函数还是非ECMAScript函数不是可以从语义上课观察到的。

results matching ""

    No results matching ""