Javascript 在HTML中从另一个脚本调用变量
我目前有一个HTML文件,其中有一个脚本声明如下:Javascript 在HTML中从另一个脚本调用变量,javascript,jquery,html,variables,call,Javascript,Jquery,Html,Variables,Call,我目前有一个HTML文件,其中有一个脚本声明如下: <script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script> <script type="text/javascript"> $(document).ready(function() { c
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
code.......
var a = "hello"
});
</script>
var bus = $({});
bus.on('some-event', function() {});
bus.trigger('some-event', ...);
$(文档).ready(函数(){
代码。。。。。。。
var a=“你好”
});
我试图在HTML文件中添加另一个脚本,该脚本将调用这个变量“a”。现在,我正在做这样的事情:
<script type="text/javascript">
alert(a);
</script>
警报(a);
但它没有发出任何警报。如果我用“hello”这样的字符串替换a,我会收到警报。我是否调用了错误的变量?我尝试过搜索解决方案,但他们都说,假设脚本在之前声明和初始化过,您应该能够轻松地从另一个脚本调用变量。谢谢。将
声明移到函数之外
例如:
后来
alert(a);
请记住,变量是函数作用域,因此如果在函数内部定义变量,则在函数外部将不可见
根据评论更新:
由于您现在在尝试与a
变量交互时遇到计时问题,因此我建议引入事件总线(或其他机制)来协调计时。鉴于您已经在使用jQuery,您可以创建一个简单的总线,如下所示:
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
code.......
var a = "hello"
});
</script>
var bus = $({});
bus.on('some-event', function() {});
bus.trigger('some-event', ...);
这实际上也有助于更好的代码组织,因为现在只需要总线是全局的,并且可以在事件中传递数据,而不是一堆其他随机变量
例如:
然后在另一个文件中:
bus.on('some-event', function(e, data) {
alert(data.a);
});
(显然不是跨多个文件传播,但适用相同的原则)。将代码替换为
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<script type="text/javascript">
var a="";
$(document).ready(function() {
a = "hello";
});
</script>
代码的问题是,您在$(document).ready()
中声明了变量a
,这使得它成为ready()
的局部变量。当您编写内部函数块时,您使它成为局部变量,您可以将变量声明移动到功能块之外,如其他答案所示,或者您可以使用:
$(document).ready(function() {
window.a = "hello";
});
后来:
alert(a);
在这两种情况下,您都将a声明为全局变量,不建议这样做。当遇到
块时,您的警报()
代码将立即运行。其他的东西只有在整个文档被解析/设置之后才会运行,所以基本上你是在变量有机会被定义之前发出警报的。它是什么都没有发出警报,还是根本没有发出警报?嗨,Marc,这很有意义。我会试着做一个快速修复。它根本没有发出警报。嗨,所以我现在可以成功调用变量,但是警报说它没有定义,所以出于某种原因,我猜变量没有被初始化。有什么原因可以解释吗?在我的代码中,我实际上是从这个.ready()函数中的一个文件中获取数据,并在解析数据时生成新变量,因此我不能在.ready()函数之前声明并初始化变量。从它的发音来看,这只是一个执行顺序问题。基本上,在初始化变量之前,您在第一个文件中等待DOM就绪事件,但在警告变量之前,您不会在第二个文件中等待DOM就绪事件。您可能需要考虑重新组织代码或引入某种类型的事件总线来处理跨文件定时问题。我会做一个快速修复,希望到时候一切都会好起来。我会告诉你发生了什么!伟大的你编辑的信息有效!!!因此,如果ready()函数中有多个变量,那么我是必须为每个变量创建一个新触发器,还是必须为每个变量创建一个新的var总线?i、 例如,var bus2、var bus3……等等,我假设没有捷径,您只需要一个触发器,就可以添加多个变量。不,您只需要使用一个事件总线(很可能是整个应用程序)。只要把你想要的数据放进去就行了。当然,如果/当它有意义时,您可以创建新事件,但是如果您只有几个值需要在DOM就绪后公开,那么您可能只需要使用单个事件进行初始化。例如,bus.trigger('some-event',{a:'hello',b:'world',foo:'bar'})
,然后您可以访问某些事件处理程序中的数据.a
,数据.b
和数据.foo
。这是一种非常灵活的方法。在我的代码中,我实际上是从这个.ready()函数中的一个文件中获取数据,并在解析数据时生成新变量,因此我不能在.ready()函数之前声明和初始化变量。我是否可以在一个.ready()函数中初始化一个变量,然后在另一个脚本中调用它?无需在ready()
中完全这样做。相反,只需在外部声明它,并在内部初始化它,就像在我编辑的asnwer中一样。我想这是因为我在初始化之前调用了该警报,但我也会尝试您编辑的答案。谢谢您是否建议创建两个单独的javascript文件,然后在我的HTML文件中调用这两个文件?事实并非如此,使用单独的文件不会改变作用域,变量可以是全局的,也可以是局部的,即使它们位于单独的文件中。您可以定义一个全局对象变量,并将其用作应用程序的命名空间var myApp={}
在任何块外部,然后在函数块内部使用myApp.a='Hello world'
并在第二个脚本标记alert(myApp.a)
一篇关于js名称空间的非常有趣的文章
alert(a);