看似定义的javascript变量抛出未定义的错误

时间:2015-08-07 18:54:02

标签: javascript scope undefined

鉴于以下代码,我不确定为什么我可以检索longAndObscureVariableName但不能检索anotherLongObscureVariableName。你能解释一下,并说明如何从jsFileNumberTwo.js访问另一个LongObscureVariableName?

HTML文档负责人最初包含:

<script type="text/javascript" id="my_globals">
var longAndObscureVariableName = "foo";
</script>

<script type="text/javascript" src="jsFileNumberOne.js" /></script>
<script type="text/javascript" src="jsFileNumberTwo.js" /></script>

Javascript文件jsFileNumberOne.js包含此代码,它将另一个全局变量添加到#my_globals元素中:

jQuery(document).ready(function() {

    // Store the initial variables, to which we will add more
    var initialVars = jQuery('#my_globals').html();
    // Define content for script tag:
    var scriptContent = initialVars;
    // Add to the script content
    scriptContent += 'var anotherLongObscureVariableName = "bar";\n';

    function insertNewInfo() {
        jQuery('#my_globals').html(scriptContent);
    };

    insertNewInfo();
});

当jsNumberOne.js执行时,#my_globals会改为:

<script type="text/javascript" id="my_globals">
var longAndObscureVariableName = "foo";
var anotherLongAndObscureVariableName = "bar";
</script>

Javascript文件jsFileNumberTwo.js包含此代码,试图找出anotherLongAndObscureVariableName的值:

jQuery(document).ready(function($) {
    console.log('longAndObscureVariableName'); // log displays "foo"
    console.log('anotherLongAndObscureVariableName'); // log displays "Uncaught ReferenceError: anotherLongAndObscureVariableName is not defined"
    console.log('window.anotherLongAndObscureVariableName'); // log displays "undefined"
    setTimeout(function(){
        console.log(window.anotherLongAndObscureVariableName);
    },2000); // log still displays "undefined"
});

我无法从jsFileNumberTwo.js中检索anotherLongAndObscureVariableName,即使我认为我将它添加到全局范围,只需将其添加到HTML文档的头部即可。

这是范围问题吗?这是时间/排序问题吗?我认为jsFileNumberTwo.js可能在jsFileNumberOne.js执行之前访问头部内容,但即使添加了setTimeout函数,我仍然会“未定义”。

发生了什么事?我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:1)

脚本从上到下运行。所以第二个脚本修改了第一个脚本,它已经运行并且不会再次运行,所以实际上没有效果。

另外,你应该把东西放在窗口上以制作全局变量。

所以替换

scriptContent += 'var anotherLongObscureVariableName = "bar";\n';

function insertNewInfo() {
    jQuery('#my_globals').html(scriptContent);
};

insertNewInfo();

window.anotherLongAndObscureVariableName = "bar";

var longAndObscureVariableName = "foo";

window.longAndObscureVariableName = "foo";

答案 1 :(得分:0)

不是添加到jsfileNumberOne.js中的现有脚本元素,而是将全局变量包含在该文件中更好。在jsfileNumberOne.js中,只需包含如下全局变量:

window.anotherLongObscureVariableName = "bar";