函数中的变量范围

时间:2018-09-12 12:12:43

标签: javascript sapui5

最近阅读了大量文章,试图揭开Javascript / SAPUI5中变量作用域的神秘面纱。我了解事物的方式主要有两种:局部变量,在函数内部声明并且仅在函数内部可见;全局变量,在函数外部声明,因此可以“全局”访问。尝试了一个很小的例子,调试显示后,我在这里感到很困惑。下面的小样:

onTestButtonPress: function() {
        var url = "/DEV/sap/opu/odata/SAP/ZCONTRACTS_SRV/Agreement_ExportSet";
        var oTest1 = [];
        var promise = $.Deferred();

        $.ajax({                
            url: url,
            type: "GET",
            dataType: "json",
            success: function(xhrData) {
                var oTest2 = xhrData;
                promise.resolve();
            }
        });

        var readyToGo = function() {
            jQuery.sap.log.error("check");
        };

        jQuery.when(promise).done().then( jQuery.proxy(readyToGo, this) );              
    }

在$ .ajax ...和jQuery.when ...语句上,oTest1 var的值为[],而在主函数(ajax成功函数和readyToGo)中包含的函数中,同一变量正在生成引用错误。

根据“理论”,除非我错过了什么,否则由于oTest1是在主函数的开头声明的,因此它在两个嵌套函数中也应可见。我在这里想念的是什么,或者换句话说,我应该在哪里(或怎么可能?)在函数中声明变量以便可见?

预先感谢

格雷格

更新:(合理的)建议后,修改了有疑问的变量的代码和附加代码。新代码是这样的:

    onTestButtonPress: function() {
        var url = "/DEV/sap/opu/odata/SAP/ZCONTRACTS_SRV/Agreement_ExportSet";
        var oTest1 = [];
        var promise = $.Deferred();

        $.ajax({                
            url: url,
            type: "GET",
            dataType: "json",
            success: function(xhrData) {
                oTest1 = xhrData;
                promise.resolve();
            }
        });

        var readyToGo = function() {
            jQuery.sap.log.error(oTest1);
        };

        jQuery.when(promise).done().then( jQuery.proxy(readyToGo, this) );              
    }

此代码运行良好,并且变量正常。仍然运行旧代码,调试器将生成以下代码:

enter image description here

这就是我没有在样本中使用var的原因,这正常吗?

1 个答案:

答案 0 :(得分:1)

由于oTest1不在范围内,因此屏幕截图中的代码中出现错误。

作用域是在创建函数时确定的,并且由于oTest1变量未在函数中使用,因此它不在作用域内。

在通过使用调试器读取变量创建函数之后,尝试将其添加到作用域。为时已晚。

console.log(oTest1)之前添加debugger,它将在范围内。