首页 > 解决方案 > 无法读取未定义的属性“对象”

问题描述

我正在尝试在我的网页中包含一个生成的 js 模块。然而它给了我一个错误:Uncaught TypeError: Cannot read property 'Object' of undefined$g["Object"]["freeze"]($env);

最小的例子是:

文件index.html

<html>
  <head>
    <meta content="text/html;charset=utf-8" http-equiv="Content-Type"/>
  </head>
  <body>
    <!-- Note the usage of `type=module` here as this is an ES6 module -->
    <script type="module">

      import { foo } from './foo.js';

      console.log(foo());

    </script>
  </body>
</html>

文件foo.js

'use strict';
/* Scala.js runtime support
 * Copyright 2013 LAMP/EPFL
 * Author: Sébastien Doeraene
 */

/* ---------------------------------- *
 * The top-level Scala.js environment *
 * ---------------------------------- */

// Get the environment info
var $env = (typeof __ScalaJSEnv === "object" && __ScalaJSEnv) ? __ScalaJSEnv : {};

// Global scope
var $g =
  (typeof $env["global"] === "object" && $env["global"])
    ? $env["global"]
    : ((typeof global === "object" && global && global["Object"] === Object) ? global : this);
$env["global"] = $g;


$env["exportsNamespace"] = void 0;


// Freeze the environment info
$g["Object"]["freeze"]($env);

export function foo() { return "Hello"; }

但是,如果我只是将脚本复制粘贴到 chrome 控制台中,那么一切都会正常运行。

标签: javascriptscala.js

解决方案


您在 Scala.js 0.6.x 中遇到了一个错误:https ://github.com/scala-js/scala-js/issues/3677 。在 Node.js 之外的 ES 模块中使用时(例如,在浏览器中),全局检测代码var $g = ...不正确,无法发现正确的全局对象。

该问题提到了一种解决方法:在您的 HTML 文件中添加以下<script>标记(在导入 Scala.js 代码的标记之前):

<script type="text/javascript">
var __ScalaJSEnv = { global: window };
</script>

这将明确告诉 Scala.js 全局对象是什么,即window.

该问题已在 Scala.js 1.x 中得到修复,其RC1 于两天前发布


推荐阅读