Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/89.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ES6中的Javascript类,如何在其他js文件和html文件中导入它们?_Javascript_Html_Class_Oop_Ecmascript 6 - Fatal编程技术网

ES6中的Javascript类,如何在其他js文件和html文件中导入它们?

ES6中的Javascript类,如何在其他js文件和html文件中导入它们?,javascript,html,class,oop,ecmascript-6,Javascript,Html,Class,Oop,Ecmascript 6,很明显,我是一个初学者,正在尝试了解基本的工作人员,所以请容忍我 我将所有这些文件(index.html、app.js和calc.js)放在同一个文件夹中,它们的内容如下所示 我有两个问题: 1:为什么在文件(app.js)中,导入类Calc并创建它的新实例是有效的,而在文件(Calc.js)中,类似的过程不适用于类测试 2:如何在*.html文件中使用类“Calc” 注意:我在MacOS10.13上使用的是chrome(62.0.3202.94(官方版本)(64位)) // app.js im

很明显,我是一个初学者,正在尝试了解基本的工作人员,所以请容忍我

我将所有这些文件(index.html、app.js和calc.js)放在同一个文件夹中,它们的内容如下所示

我有两个问题:

1:为什么在文件(app.js)中,导入类Calc并创建它的新实例是有效的,而在文件(Calc.js)中,类似的过程不适用于类测试

2:如何在*.html文件中使用类“Calc”

注意:我在MacOS10.13上使用的是chrome(62.0.3202.94(官方版本)(64位))

// app.js
import { Calc } from './calc.js';

class Test {
    static hello() {
        console.log("hello from class1");
    }
}

let c = new Calc(); // this works!

console.log(c.sum(2, 3) + 1); // 6

export { Test }; 

最后是HTML文件:

<html>

<head>
    <meta charset="utf-8" />
    <script src="./app.js" type="module"></script>
    <script src="./calc.js" type="module"></script>
</head>

<body>
    <h1>ES6</h1>
<script>
    let c = new Calc();
    // simulate input summation from two textboxes for example
    console.log(c.sum(2, 1)); //Uncaught ReferenceError: Calc is not defined
</script>
</body>

</html>

ES6
设c=新计算();
//例如,模拟来自两个文本框的输入总和
console.log(c.sum(2,1))//未捕获引用错误:未定义计算

问题1:

您有一个循环依赖项-
app.js
imports
calc.js
,但是
calc.js
imports
app.js

通常,模块系统将确保在模块本身之前执行模块的所有依赖项,但当依赖项树有周期时,这是不可能的——它必须首先选择其中一个周期来运行。在本例中,首先运行
calc.js
,此时尚未定义
Test

如果你很小心的话,有很多方法可以解决这个问题,但是循环依赖性几乎总是你构造代码错误的标志——最好的解决方案是重新组织它,这样你就不再有循环了

问题2:

ES2016模块不在全局范围内执行。如果要使某个内容作为一个整体对窗口可用,则需要明确:

window.Calc = Calc;

问题1:

您有一个循环依赖项-
app.js
imports
calc.js
,但是
calc.js
imports
app.js

通常,模块系统将确保在模块本身之前执行模块的所有依赖项,但当依赖项树有周期时,这是不可能的——它必须首先选择其中一个周期来运行。在本例中,首先运行
calc.js
,此时尚未定义
Test

如果你很小心的话,有很多方法可以解决这个问题,但是循环依赖性几乎总是你构造代码错误的标志——最好的解决方案是重新组织它,这样你就不再有循环了

问题2:

ES2016模块不在全局范围内执行。如果要使某个内容作为一个整体对窗口可用,则需要明确:

window.Calc = Calc;

非常感谢你。问题1完美地解决了。然而,在Problem2中,我仍然得到了
未捕获引用错误:Calc未定义
,尽管我在标题
中添加了脚本。换句话说,我不能添加属性
window.Calc
,因为类Calc没有定义!您将
窗口放在哪里。Calc=Calc
?它需要在您的一个模块中,而不是在HTML中。谢谢:)这解决了剩余的问题:D@user2804070:Brilliant:)我建议您将所有代码保留在模块中,而不是尽可能将部分代码保留在HTML中,因为这会让事情变得更干净-尽管有时您没有选择,所以知道如何解决这个问题很好。非常感谢。问题1完美地解决了。然而,在Problem2中,我仍然得到了
未捕获引用错误:Calc未定义
,尽管我在标题
中添加了脚本。换句话说,我不能添加属性
window.Calc
,因为类Calc没有定义!您将
窗口放在哪里。Calc=Calc
?它需要在您的一个模块中,而不是在HTML中。谢谢:)这解决了剩余的问题:D@user2804070:Brilliant:)我建议您将所有代码保留在模块中,而不是尽可能将部分代码保留在HTML中,因为这会让事情变得更干净-尽管有时您没有选择,所以知道如何解决这个问题很好。