试图覆盖全局变量时出现jQuery.post()作用域问题

jQuery.post() scope issue while trying to overwrite global variable

本文关键字:post 作用域 问题 jQuery 覆盖 全局变量      更新时间:2023-09-26

我在代码中遇到了一些与范围有关的困难。这是我的代码:

<script type="text/javascript">
    var totalHoras = {};
    var dadosCategorias = {"teste": "1234"};
    var t; // timeout handler para exibição de feedback para o usuário
    $().ready(function() {
        // obtém dados das categorias
        var obterDadosCategorias = function() {
            $.post(
                "{{ baseRoute }}/cadastro/categoria/listar"
                , {
                    "ajax": "true"
                }
            ).done(function(data) {
                var obj = $.parseJSON(data);
                if (obj.result) {
                    console.log(dadosCategorias); // returns 'object{"teste": "1234"}'
                    dadosCategorias = obj.data;
                    console.log(dadosCategorias); // returns 'string(11) "it works!!!"'
                } else {
                    alert('Erro interno: não foi possível obter os dados das categorias');
                }
            });
        };
        obterDadosCategorias();
        console.log(dadosCategorias); // returns 'object{"teste": "1234"}'

问题是:为什么console.log的第三次调用会返回原始的var值?不是被覆盖了吗?

控制台被认为是

'object{"teste": "1234"}'
'string(11) "it works!!!"'
'string(11) "it works!!!"'

但它是

'object{"teste": "1234"}'
'string(11) "it works!!!"'
'object{"teste": "1234"}'

我尝试过在$.ajax()函数中使用window的"context"选项,但不起作用:(

感谢大家的评论!:D

我找到了答案。问题根本不在于范围。实际上,对console.log()的调用并没有按照脚本的顺序进行。调用顺序以前是312,现在是123:D我将ajax方法改为$.ajax()而不是$.post(),并将选项"async"设置为false以实现这一点,如下所示:

<script type="text/javascript">
    var totalHoras = {};
    var dadosCategorias = {"teste": "1234"};
    var t; // timeout handler para exibição de feedback para o usuário
    $().ready(function() {
        // obtém dados das categorias
        var obterDadosCategorias = function() {
            $.ajax(
                "{{ baseRoute }}/cadastro/categoria/listar"
                , {
                    "type": "POST"
                    , "async": false
                    , "data": {
                        "ajax": "true"
                    }
                }
            ).done(function(data) {
                var obj = $.parseJSON(data);
                if (obj.result) {
                    console.log(1, dadosCategorias);
                    dadosCategorias = obj.data;
                    console.log(2, dadosCategorias);
                } else {
                    alert('Erro interno: não foi possível obter os dados das categorias');
                }
            });
        };
        obterDadosCategorias();
        console.log(3, dadosCategorias);