无法在函数内部更新全局变量并在函数外部调用它(jQuery)

Unable to update global variable inside a function and call it outside it (jQuery)

本文关键字:函数 jQuery 外部调用 全局变量 内部 更新      更新时间:2023-09-26

我读过一些关于这个主题的其他问题,许多人说,如果我在函数外声明变量varA(在全局作用域内),它是一个全局函数,因此它可以被任何函数使用和更新,对吗?

现在,我有这个例子,我在函数外声明一个变量,在函数内改变它,但是当我在函数外调用它时,它显示为undefined,如果我在函数内调用它,它被改变了。

$(document).ready(function() {
    var varA;
    $(function() {
        varA = 'varA has been altered!';
        alert(varA); //displays 'varA has been altered!'
    });
    alert(varA); //displays 'undefined'
});

这对我来说似乎不合乎逻辑:当我改变一个全局变量时,第二个alert();不应该显示varA的值吗?

这个问题的解决方法是什么?我怎么能改变一个全局变量内的函数,并得到该值外的函数?

欢呼编辑:

我需要能够在多个函数中访问varA,所以它需要在$(function() {});

之前声明

问题是访问varA有一个竞争条件:如果$(function() {});下面的代码在函数内部的代码之前运行,那么它将不会被定义。

在这种情况下,$(document).ready()$()是一样的,所以document应该已经在函数中准备好了。因此,您可以直接运行

$(function() {
    var varA;
    varA = 'varA has been altered!';
    alert(varA); //displays 'varA has been altered!'
});

这不是作用域的问题:这里有一个例子,作用域是类似的,但是竞争条件被删除了,所以代码可以工作:

$(function() {
    var varA;
    var def = $.Deferred();
    def.then(function() {
        varA = 'varA has been altered!';
    }).then(function() {
        alert(varA); //displays 'varA has been altered!'
    });
    def.resolve();
});

正如@mc10提到的,这主要是由于访问varA的竞争条件造成的。这是因为$(document).ready()在回调调用之前等待readystatechange事件作为准备就绪而触发,但是它也运行setTimeOut来检查readystatechange事件是否已经触发。

因此任何像

这样的代码
$(document).ready(function(){
    a();
    $(b);
    c();
});

将按顺序执行

  1. c
  2. b

默认情况下,javascript变量得到'undefined'作为值,直到他们被分配一些值。在这种情况下,你的内部函数并没有首先执行,警报首先执行,在那个时候变量的值是"未定义",所以你得到相同的。

要避免这种情况,您可以尝试如下操作:

        $(document).ready(function () {
        var varA;
        (function () {
            varA = 'varA has been altered!';
            console.log(varA); //displays 'varA has been altered!'
        }());
        console.log(varA); //displays 'varA has been altered!'
    });