JavaScript 通过脚本标签定义作用域
javascript defines scope by script tags?
从未遇到过这个问题,也不知道为什么。唯一的解释是范围问题。
在同一页面中,我有 2 个 JS 部分:
...
<script type="text/javascript">
go();
</script>
<script type="text/javascript">
function go()
{ alert(''); }
</script>
...
这将显示一个错误:未定义 go
哪里
...
<script type="text/javascript">
go();
function go()
{ alert(''); }
</script>
...
正在工作(显然)。
<script>
标签会创建 JS 的作用域吗?帮助?
这不是范围问题。如果在一个脚本元素中定义函数(在全局范围内),则可以在另一个脚本元素中使用它。
但是,脚本元素在遇到时会进行分析和执行。
提升无法跨脚本元素工作。在较新版本的脚本元素中定义的函数在早期脚本元素的初始运行期间将不可用。
您要么需要交换脚本元素的顺序,要么将函数调用延迟到定义它的脚本运行之后(例如,通过将其附加到onload
事件处理程序)。
<script>
function go() {
alert('');
}
</script>
<script>
go();
</script>
或
<script>
window.addEventListener("load", function () {
go();
}, false);
</script>
<script>
function go() {
alert('');
}
</script>
html 解析器在移动到下一个元素之前停止执行脚本。所以下一个脚本元素在执行第一个之前不执行。
这相当于:
<script>
document.getElementById("hello") //null because the html parser hasn't met the div yet.
</script>
<div id="hello"></div>
造成明显错误的另一个原因是,如果第一个脚本块存在语法错误并被完全拒绝,但第二个块继续运行并错过其好友代码。
正如已经说过的,顺序很重要。值得一提的是,我在一次实验(不是生产!)中看到了这个问题,我有这样的东西:
<head>
<script src="/path/one.js" defer>
</head>
<body>
<script>
methodInOneJs();
</script>
</body>
浏览器抱怨引用错误,即使methodInOneJs()
在一个.js中定义。这是因为加载它的script
中的defer
属性。有人可能会认为将defer
放在内联script
中也可以解决问题,但根据MDN的说法:
警告:如果 src 属性为不存在(即对于内联脚本),在这种情况下,它将没有影响。
一个快速的解决方案(除了完全删除defer
之外)是使用 onload
事件(同样,不是生产,我只使用 src
):
<head>
<script src="/path/one.js" defer>
</head>
<body onload="run();">
<script>
function run()
{
methodInOneJs();
}
</script>
</body>
这是因为使用defer
:
脚本应在文档解析后执行,但在发射 DOMContentLoaded 之前。
强调"在发射 DOMContentLoaded 之前"。另请参阅最后如何加载脚本。
- 在具有命名作用域的自定义Polymer元素中隐藏表行
- 如何在html中以角度显示自定义指令的作用域
- 如何在angularjs中将多个作用域变量传递到自定义指令中
- AngularJS:如何调用指令中定义的函数'控制器的作用域
- AngularJS:ngRepeat作用域在具有隔离作用域和ngTransclude的自定义指令中失败
- AngularJS指令中的作用域未定义,控制器中有ajax请求
- ReferenceError:regeneratorRuntime未定义(但在作用域内工作)
- 监视自定义指令属性在父作用域更改时不发生更改
- 在全局作用域中定义的具有相同名称的变量
- 角度:创建可以调用作用域函数的自定义指令
- AngularJS指令作用域未解析(“属性名称未定义”错误)
- $scope变量在指令隔离作用域中未定义
- AngularJS自定义指令在继承父作用域时访问模板中的属性
- 无法从具有隔离作用域的指令中访问控制器中定义的对象
- 在指令的隔离作用域中定义的调用函数
- 如何使 AngularJS 指令在不隔离作用域的情况下清楚地定义其依赖关系
- JavaScript 通过脚本标签定义作用域
- 变量未定义作用域
- 全局变量未定义-作用域问题
- Javascript自定义作用域绑定函数