如果我在脚本标记之后声明一个全局变量,那么在文档就绪中调用的函数中访问此变量是否安全?
<script type="text/javascript">
var bar = "foo";
$(document).ready(function(){
callBar()
});
function callBar(){
alert(bar);
// will I crash?
}
</script>
如果我这样做的话:
<script type="text/javascript">
$(document).ready(function(){
callBar()
});
function callBar(){
alert(bar);
// will I crash?
}
var bar = "foo";
</script>
答案 0 :(得分:7)
在文档就绪
中调用的函数中访问此变量是否安全
是。作为执行该脚本的非常早期的步骤,将变量声明(added as a binding到执行上下文的变量环境)。 (请注意,在解析期间到达赋值语句之前,它实际上不会被赋值。这通常被称为“提升”,但不会影响您的示例。)
由于脚本执行是同步的(浏览器将在完成解析和执行脚本元素之前停止呈现),因此DOM就绪事件在执行完成之前不会触发。
修改 (问题已更新)
如果我这样做的话......
如上所述,变量声明将被提升到它出现的范围的顶部。您的第二个示例有效地解释如下:
// Declarations (both function and variable) are hoisted
var bar;
function callBar() {
alert(bar);
}
$(document).ready(function () {
callBar();
});
bar = "foo";
因此,这些声明在整个范围内都可用。 ready事件处理程序将在稍后执行,并且可以访问这些声明(因为它们出现在与它相同的范围内)。
答案 1 :(得分:0)
由于bar
在全局范围内声明,我希望在调用callBar
之前对其进行初始化。
还要考虑JavaScript具有函数提升功能,如果它们在适当的范围内,则允许引用变量,即使它们稍后在程序中定义(尽管这不是这里的情况)。来自Variable Scope上的MDN文档:
JavaScript中变量的另一个不同寻常之处在于,您可以引用稍后声明的变量,而不会出现异常。这个概念被称为吊装; JavaScript中的变量在某种意义上是“被提升”或被提升到函数或语句的顶部。但是,尚未初始化的变量将返回未定义的值。
答案 2 :(得分:0)
是的,甚至在'关闭'标签之前。
'$(document).ready(function(){})'构造中的函数在加载所有页面后触发。
答案 3 :(得分:0)
使用全局变量是safe
。
但是在Jquery
中使用全局变量时必须小心使用Window.bar="foo"
代替var bar="foo"
获取更多信息Best ways to use Global Variables in Jquery
我使用了全局变量,非常有用..