ES6モジュールをテストしており、ユーザーがonclick
を使用してインポートされた関数にアクセスできるようにしたい:
test.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Module Test</title>
</head>
<body>
<input type="button" value="click me" onclick="hello();"/>
<script type="module">import {hello} from "./test.js";</script>
</body>
</html>
test.js:
export function hello() {console.log("hello");}
ボタンをクリックすると、開発者コンソールに「ReferenceError:hello is not defined」と表示されます。 onclick関数として使用できるように、モジュールから関数をインポートするにはどうすればよいですか?
dom.moduleScripts.enabled
をtrue
に設定してFirefox 54.0を使用しています。
モジュールは、名前の衝突を避けるためにスコープを作成します。
関数をwindow
オブジェクトに公開する
import {hello} from './test.js'
window.hello = hello
または、addEventListener
を使用してハンドラーをバインドします。 デモ
<button type="button" id="hello">Click Me</button>
<script type="module">
import {hello} from './test.js'
document.querySelector('#hello').addEventListener('click', hello)
</script>
ES6
_モジュールのモジュールスコープ:_type="module"
_を使用して次の方法でスクリプトをインポートする場合:
_<script type="module">import {hello} from "./test.js";</script>
_
モジュールスコープと呼ばれる特定のスコープを作成しています。ここで、モジュールのスコープは他のレベルのスコープに関連しています。グローバルから始まります:
const
およびlet
forブロック内)のすべての宣言は、Javascriptランタイム環境のどこからでもアクセスできます。let
およびconst
変数はブロックスコープですモジュールでhello()
関数が宣言されたため、referenceErrorが発生していました。これはmodule scopedでした。前に見たように、モジュールスコープ内の宣言はそのモジュール内でのみ利用可能であり、モジュールを使用してそれを使用しようとしました。
explicitlywindowオブジェクトに置くと、モジュールの外側で使用できるように、モジュール内で宣言を行うことができます。例えば:
_window.hello = hello; // putting the hello function as a property on the window object
_