【问题标题】:Javascript variables between files [closed]文件之间的Javascript变量[关闭]
【发布时间】:2013-01-17 16:38:51
【问题描述】:

好的,所以我有两个文件,index.html 和 functions.js(index.html 正确包含 functions.js)。

当单击网页中的按钮时,函数文件中会调用一个函数,该函数会更新网页中的元素(正确)并尝试设置两个全局变量(通过执行window.var1window.var2 . 到目前为止,Web 控制台中没有错误。

调用此函数后,我在 index.html 中运行一段 JS 代码,尝试读取 window.var1window.var2,但发现它们均为空。

这是为什么呢?您能否请我指出一些关于为什么会发生这种情况的材料,而不仅仅是解决方案?

编辑 我正在使用 jquery 和 jquery mobile。 调用这两个函数的事件处理函数是

 $('#map').live('pageshow',function(){
            console.debug('clicked button, calling function');
            position(longitude,latitude); //sets the global vars
            initializeMap();
            console.debug('finished with map calling');
        });

并位于 document.ready() 中。

编辑 2 我知道这两个函数是按顺序发生的,我在它们的入口点做了一个 console.log()。

【问题讨论】:

  • 你确定“之后”吗?
  • 你能展示你的代码吗?
  • 请在您的问题中包含相关的index.htmlfunctions.js 代码
  • 你确定你的调用函数的整个执行是同步的吗?不涉及 ajax 吗?
  • 为什么用“window”读取变量。在前 ?它应该在没有的情况下工作

标签: javascript variables window global


【解决方案1】:

在没有完整代码的情况下,我会四处走动......

可能是您在函数中声明和设置这些变量。函数范围意味着它们不存在于声明的任何函数之外。解决方案是在任何函数之外(即在文件顶部)声明它们(使用var 关键字),并将它们设置在函数内部。

否则,它们不是全局的。

如果完全不是这样,请原谅我

var myGlobal = 0;

myFunction = function() {
    myGlobal = 42;
}

// myGlobal now is equal to 42

然而……

myFunction = function() {
    var myGlobal = 42;
}

// myGlobal now is null

【讨论】:

  • 对不起,不包括完整的源代码,对于这个例子来说太大/太复杂了!事实证明,该函数内部的其他一些函数是异步的,这把事情搞砸了..
  • @Dio " 原来该函数内部的一些其他函数是异步的,并且把事情搞砸了" => 你没有充分的理由接受这个答案。
【解决方案2】:

纬度和经度变量在函数的局部范围内声明。(我假设您显示的代码是完整的代码)

要正确使用全局范围,请在代码上方添加:

var latitude = 0;
var longtitude = 0;

现在您的功能将正常工作。 但是请记住,全局变量是不好的。从长远来看,它们可能会弄乱您的代码。我建议你使用module 设计模式。

【讨论】:

    【解决方案3】:

    所以我通常对我希望在全局范围内访问的变量执行此操作,但不会污染实际的全局区域:

    window.PositionData = window.PositionData || {};
    

    这一行要么实例化变量,要么如果它已经存在,则将其设置为等于自身,因此不会被覆盖。

    PositionData.var1;
    PositionData.var2;
    

    然后像这样设置/检索值:

    PositionData.var1 = 1;
    PositionData.var2 = PositionData.var1;
    

    【讨论】:

    • 这不是一个答案,他的变量为空,因为他错误地分配了它们......
    • 他刚刚编辑了他的问题,使其更具描述性,这当然符合他之前的问题......
    • 请解释为什么这个答案如此糟糕,需要被否决?
    • 你并没有真正提供如何解决问题..
    • 如果您使用严格模式,则不是这样。如果您有这样的代码,删除 window 将严重失败:(function() { "use strict"; window.foo = 'bar'; })()
    猜你喜欢
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    • 2021-06-20
    • 2014-03-07
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 2011-10-07
    相关资源
    最近更新 更多