最近阅读了大量文章,试图揭开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) );
}
此代码运行良好,并且变量正常。仍然运行旧代码,调试器将生成以下代码:
这就是我没有在样本中使用var的原因,这正常吗?
答案 0 :(得分:1)
由于oTest1
不在范围内,因此屏幕截图中的代码中出现错误。
作用域是在创建函数时确定的,并且由于oTest1
变量未在函数中使用,因此它不在作用域内。
在通过使用调试器读取变量创建函数之后,尝试将其添加到作用域。为时已晚。
在console.log(oTest1)
之前添加debugger
,它将在范围内。