V8 运行时概览

在 Apps 脚本和 JavaScript 中,运行时或运行时环境包含 解析和执行脚本代码的 JavaScript 引擎。运行时提供 内存访问、程序如何与 计算机操作系统,以及哪种程序语法是合法的。每个网站 提供 JavaScript 运行时环境。

Apps 脚本由 Mozilla 的 Rhino JavaScript 提供支持 翻译。虽然 Rhino 提供了一种便捷的 Apps 脚本执行方式, 开发者脚本,也会将 Apps 脚本与特定的 JavaScript 版本相关联 (ES5)。Apps 脚本开发者 无法使用 Rhino 工具在脚本中使用更现代的 JavaScript 语法和功能 运行时。

为了解决这个问题, 为 Chrome 和 Node.js 提供支持的 V8 运行时。您可以 将现有脚本迁移到 V8 以便充分利用现代 JavaScript 语法和功能。

此页面介绍了 V8 启用的新功能以及如何启用 V8 以便在脚本中使用 将脚本迁移到 V8 介绍了迁移现有脚本以使用 V8 运行时的步骤。

V8 运行时的功能

使用 V8 运行时的脚本可以利用以下功能 功能:

现代 ECMAScript 语法

您可以使用新型 ECMAScript 语法。此语法包括 letconst以及许多其他热门功能。

请参阅 V8 语法示例,获取热门选项列表 语法改进。

改进了功能检测

针对使用 V8 的脚本改进了 Apps 脚本功能检测。新的 运行时可识别以下函数定义格式:

      function normalFunction() {}
      async function asyncFunction() {}
      function* generatorFunction() {}

      var varFunction = function() {}
      let letFunction = function() {}
      const constFunction = function() {}

      var namedVarFunction = function alternateNameVarFunction() {}
      let namedLetFunction = function alternateNameLetFunction() {}
      const namedConstFunction = function alternateNameConstFunction() {}

      var varAsyncFunction = async function() {}
      let letAsyncFunction = async function() {}
      const constAsyncFunction = async function() {}

      var namedVarAsyncFunction = async function alternateNameVarAsyncFunction() {}
      let namedLetAsyncFunction = async function alternateNameLetAsyncFunction() {}
      const namedConstAsyncFunction = async function alternateNameConstAsyncFunction() {}

      var varGeneratorFunction = function*() {}
      let letGeneratorFunction = function*() {}
      const constGeneratorFunction = function*() {}

      var namedVarGeneratorFunction = function* alternateNameVarGeneratorFunction() {}
      let namedLetGeneratorFunction = function* alternateNameLetGeneratorFunction() {}
      const namedConstGeneratorFunction = function* alternateNameConstGeneratorFunction() {}

      var varLambda = () => {}
      let letLambda = () => {}
      const constLambda = () => {}

      var varAsyncLambda = async () => {}
      let letAsyncLambda = async () => {}
      const constAsyncLambda = async () => {}

从触发器和回调调用对象方法

使用 V8 的脚本可以从位置调用对象方法和类静态方法 其中您已经可以调用库方法。这些地点包括 以下:

以下 V8 示例展示了在构建 Google 表格中的菜单项:

function onOpen() {
  var ui = SpreadsheetApp.getUi(); // Or DocumentApp, SlidesApp, or FormApp.
  ui.createMenu('Custom Menu')
      .addItem('First item', 'menu.item1')
      .addSeparator()
      .addSubMenu(ui.createMenu('Sub-menu')
          .addItem('Second item', 'menu.item2'))
      .addToUi();
}

var menu = {
  item1: function() {
    SpreadsheetApp.getUi().alert('You clicked: First item');
  },
  item2: function() {
    SpreadsheetApp.getUi().alert('You clicked: Second item');
  }
}

查看日志

Apps 脚本提供两种日志记录服务: Logger 服务console 类。这两种服务 将日志写入相同的 Stackdriver Logging 服务

如需显示 Loggerconsole 日志,请点击脚本编辑器顶部的 执行日志

查看执行情况

要查看脚本的执行历史记录,请打开 Apps 脚本项目,然后前往 点击左侧的执行项

V8 语法示例

下面简要列出了可用的常用语法功能, 脚本。

letconst

letconst 通过关键字,您可以定义屏蔽级局部变量和屏蔽级作用域 常量。

// V8 runtime
let s = "hello";
if (s === "hello") {
  let s = "world";
  console.log(s);  // Prints "world"
}
console.log(s);  // Prints "hello"

const N = 100;
N = 5; // Results in TypeError
      

箭头函数

箭头函数 提供了一种在表达式中定义函数的紧凑方式。

// Rhino runtime
function square(x) {
  return x * x;
}

console.log(square(5));  // Outputs 25
      
// V8 runtime
const square = x => x * x;
console.log(square(5));  // Outputs 25

// Outputs [1, 4, 9]
console.log([1, 2, 3].map(x => x * x));
      

提供了一种从概念上组织继承的方法。V8 中的类 与基于 JavaScript 原型的继承相比,主要是语法糖。

// V8 runtime
class Rectangle {
  constructor(width, height) { // class constructor
    this.width = width;
    this.height = height;
  }

  logToConsole() { // class method
    console.log(`Rectangle(width=${this.width}, height=${this.height})`);
  }
}

const r = new Rectangle(10, 20);
r.logToConsole();  // Outputs Rectangle(width=10, height=20)
      

解构分配

解构分配 表达式是将数组和对象中的值打包成 不同的变量。

// Rhino runtime
var data = {a: 12, b: false, c: 'blue'};
var a = data.a;
var c = data.c;
console.log(a, c);  // Outputs 12 "blue"

var array = [1, 2, 3];
var x = a[0];
var y = a[1];
var z = a[2];
console.log(x, y, z);  // Outputs 1 2 3
      
// V8 runtime
var data = {a: 12, b: false, c: 'blue'};
var {a, c} = data;
console.log(a, c);  // Outputs 12 "blue"


var array = [1, 2, 3];
var [x, y, z] = array;
console.log(x, y, z);  // Outputs 1 2 3


      

模板字面量

模板字面量 是允许使用嵌入式表达式的字符串字面量。它们可让您避免 更复杂的字符串串联语句。

// Rhino runtime
var name =
  'Hi ' + first + ' ' + last + '.';
var url =
  'http://localhost:3000/api/messages/'
  + id;
      
// V8 runtime
var name = `Hi ${first} ${last}.`;
var url =
  `http://localhost:3000/api/messages/${id}`;


      

默认参数

默认参数 可让您为函数中的函数参数指定默认值 声明。这可以简化函数正文中的代码,因为它会移除 需要为缺失的参数明确分配默认值。

// Rhino runtime
function hello(greeting, name) {
    greeting = greeting || "hello";
    name = name || "world";
    console.log(
        greeting + " " + name + "!");
}

hello();  // Outputs "hello world!"
      
// V8 runtime
var hello =
  function(greeting="hello", name="world") {
      console.log(
        greeting + " " + name + "!");
  }

hello();  // Outputs "hello world!"

      

多行字符串

你可以定义 多行字符串 使用与模板字面量相同的语法。与 模板字面量,那么使用此语法可以避免字符串串联,并简化 字符串定义。

// Rhino runtime
var multiline = "This string is sort of\n"
+ "like a multi-line string,\n"
+ "but it's not really one.";
      
// V8 runtime
var multiline = `This on the other hand,
actually is a multi-line string,
thanks to JavaScript ES6`;
      

启用 V8 运行时

如果脚本使用的是 Rhino 运行时,您可以通过以下方式将其切换到 V8: 执行以下操作:

  1. 打开 Apps 脚本项目。
  2. 点击左侧的项目设置
  3. 选中启用 Chrome V8 运行时复选框。

或者,您可以通过以下命令直接指定脚本运行时 修改脚本清单 文件:

  1. 打开 Apps 脚本项目。
  2. 点击左侧的项目设置
  3. 选择显示“appsscript.json”“清单文件”复选框。
  4. 点击左侧的 Editor > appsscript.json
  5. appsscript.json 清单文件中,设置 runtimeVersion 字段的值 V8
  6. 点击顶部的保存项目

有关将脚本迁移到 V8 的说明 确保脚本使用 V8 能够正常运行的其他步骤。

启用 Rhino 运行时

如果您的脚本使用的是 V8,并且您需要将其切换为原始版本 Rhino 运行时,请执行以下操作:

  1. 打开 Apps 脚本项目。
  2. 点击左侧的项目设置
  3. 取消选中启用 Chrome V8 运行时复选框。

或者,修改您的脚本清单:

  1. 打开 Apps 脚本项目。
  2. 点击左侧的项目设置
  3. 选择显示“appsscript.json”“清单文件”复选框。
  4. 点击左侧的 Editor > appsscript.json
  5. appsscript.json 清单文件中,设置 runtimeVersion 字段的值 DEPRECATED_ES5
  6. 点击顶部的保存项目

如何迁移现有脚本?

将脚本迁移到 V8 指南介绍了将现有脚本迁移到 请使用 V8。这涉及启用 V8 运行时并检查脚本 任何已知的不兼容性问题

将脚本自动迁移到 V8

从 2020 年 2 月 18 日开始,Google 将开始逐步迁移现有的 通过我们的自动兼容性测试的脚本。受影响的脚本 在迁移后继续正常运行。

如果您希望为某个脚本停用自动迁移功能,请将 runtimeVersion 字段设置为 DEPRECATED_ES5。您可以选择手动 将脚本迁移到 V8

如何报告错误?

支持指南介绍了如何开始编程 在 Stack Overflow 上寻求帮助,搜索现有问题报告,提交新错误,以及 提出新功能请求。