带窗口对象的全局变量始终未定义

时间:2014-12-26 22:29:34

标签: javascript

我的项目中有2个js文件

first.js:

(function () {
    "use strict";

    function konumBul() {

        if (navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(konumGoster, konumHata, {enableHighAccuracy: true});
        } else {
            alert("Geolocation is not supported by this browser.");
        }
    }

    function konumGoster(position) {

        //merkez koordinatları
        window.merkez = L.latLng(position.coords.latitude, position.coords.longitude);
    }
    konumBul();
}());

second.js:

(function () {
    "use strict";

    alert(window.merkez); //undefined
    alert(merkez) //undefned
}());

我怎样才能达到" merkez" second.js中的变量?为什么我使用的方式不起作用?

编辑:我写了不好意思。我在someFunction()文件

中拨打了first.js

3 个答案:

答案 0 :(得分:1)

根据您的示例,永远不会调用someFunction(),因此不会计算window.center。通过将first.js更改为:

,可以通过以下两种方式解决此问题
(function () {
    "use strict";
    window.center = L.latLng(position.coords.latitude, position.coords.longitude);
}());

或:

(function () {
    "use strict";
    function someFunction() {
        window.center = L.latLng(position.coords.latitude, position.coords.longitude);
    }
    someFunction();
}());

编辑:

您的问题是getCurrentPosition()是一个异步函数。这意味着在加载第二个脚本之前,您的回调可能无法执行。有几种方法可以解决这个问题。您可以使用Promise实现,或者只在第二个文件中使用简单的超时循环,例如:

(function () {
    "use strict";
    function doWorkWithResult() {
        if (window.merkez == undefined) {
            setTimeout(doWorkWithResult, 100); //Callback hasn't been called yet, wait 100 ms
        } else {
            alert(window.merkez);
        }
    }

    doWorkWithResult();
}());

答案 1 :(得分:1)

您的代码看起来不错,您应该能够从第二个文件访问全局center引用。如果您的代码仍未正确运行,那么您要检查的唯一内容是导入引用的顺序以及您的任何代码是否异步(看起来不是这样)。 发布代码示例woudl help

话虽如此,我强烈建议您研究一下,使用AMD模块加载程序(如RequireJS)来组织代码及其依赖项在小模块中。它还可以帮助您避免污染全局范围以在自封装模块之间传递信息。

然后,您的代码将被重构为以下内容:

coord.js

require(['longitude'], function(L){
   var position = ...;

   return {
      center: L.latLng(position.coords.latitude, position.coords.longitude);
   };
});

main.js

require(['coord'], function(Coord){
   var center = Coord.center;
   console.log('center', center);
});

答案 2 :(得分:0)

“someFunction”永远不会被执行。我不确定为什么你的代码包含在另一个函数中。 这将立即执行

(function(){
     window.center = L.latLng(position.coords.latitude, position.coords.longitude);
})();
相关问题