我对Javascript中的范围以及如何识别全局函数感到困惑。在我的页面上我有
<script src="base64.js"></script>
定义。然后在另一个文件中,我有
var xhr = new XMLHttpRequest;
...
var full = location.protocol+'//'+location.hostname+(location.port ? ':'+location.port: '');
alert(Base64.decode("abc"));
xhr.open("get", full + "myotherfile.js", true);
xhr.send()
警报执行没有问题。但是在&#34; mytoherfile.js&#34;对Base64类的引用会导致RerefernceError。所以在myotherfile.js的顶部我试过
import {Base64} from 'base64';
但这会导致&#34;未捕获的SyntaxError:意外的令牌{&#34;错误。什么是正确的方法来包含在通过AJAX加载的JS文件中识别我的全局函数?
编辑:使用
加载远程加载的JS文件this.worker = new Worker(xhrResponseText);
答案 0 :(得分:0)
主页中加载的脚本在Web worker中不可用,您必须使用importScripts
导入它们而不是导入命令
importScripts("base64.js");
答案 1 :(得分:-1)
在老式(非模块)javascript文件中,隐含在窗口上进行全局变量。因此,在第一个示例中,Base64.decode("abc")
与window.Base64.decode("abc")
相同。然而,在模块中,情况并非如此。如果要在窗口上访问全局变量,则必须明确地完成。
在模块中,尝试将对Base64
的引用更改为window.Base64
。
旁注:如果base64.js
文件使用基本脚本标记导入,那么将它作为es6模块导入它将不起作用(import {Base64} from 'base64';
)。您可以阅读有关如何导入模块here的更多信息!
希望有所帮助!
为清楚起见,这里有几个例子。基本上,你必须从正在导入的脚本中导出花括号({ Base64}
)中的内容,而不是放在窗口上。
<script src=".../base64.js"></script>
<script>
// both are accessible this way because this is NOT a module
// and global variables are assumed to be on the window.
console.log(Base64);
console.log(window.Base64);
</script>
<script type="module">
// Will not work:
// import { Base64 } from ".../base64.js
// import { window.Base64 } from ".../base64.js
// The same as importing view the script tag
// (not needed because the script tag already imported it)
// import ".../base64.js"
// the "global variable" is accessible on the window
console.log(window.Base64)
</script>
答案 2 :(得分:-2)
问题在于您所指的路径。以下是类型模块中的有效路径。
// Supported:
import {foo} from 'https://jakearchibald.com/utils/bar.js';
import {foo} from '/utils/bar.js';
import {foo} from './bar.js';
import {foo} from '../bar.js';
// Not supported:
import {foo} from 'bar.js';
import {foo} from 'utils/bar.js';
尝试直接参考路径。像这样的东西
import {addTextToBody} from '../../someFolder/someOtherfolder/utils.js';
这里是有效的pathName
Starts with ./ :- same folder
Starts with ../ :- Parent folder
Starts with ../../ :- above parentfolder