点击此处---> 群内免费提供SAP练习系统(在群公告中)
加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)
专家您好,
最近阅读了大量文章,试图揭开Javascript/SAPUI5中变量作用域的神秘面纱。 我了解事物的方式主要有两种:局部变量,在函数内部声明并且仅在内部可见;全局变量在函数外部声明,因此可以"全局"访问。 尝试了一个很小的示例,调试显示后,我在这里感到很困惑。 下面的小样:
onTestButtonPress:function(){ var url ="/img/DEV/sap/opu/odata/SAP/ZCONTRACTS_SRV/Agreement_ExportSet"; var oTest1 = []; var promise = $ .Deferred(); $ .ajax({ 网址:网址, 类型:" GET", dataType:" json", 成功:function(xhrData){ oTest1 = xhrData; promise.resolve(); } }); var readyToGo = function(){ jQuery.sap.log.error(oTest1); }; jQuery.when(promise).done()。then(jQuery.proxy(readyToGo,this)); }
在$ .ajax ...和jQuery.when ...语句上,当在主函数( ajax成功函数)所包含的函数中, oTest1 var的值为[] 和 readyToGo),相同的变量会产生参考错误。
根据"理论",除非我错过了一些事情,否则由于 oTest1 是在主函数的开头声明的,因此它在两个嵌套函数中也应可见。 我在这里想念的是什么,或者换句话说,我应该在哪里(或怎么可能?)在函数中声明变量以便可见?
预先感谢
格雷格
更新:经过(合理)建议,修改了有疑问的变量的代码和附加代码。 新代码是这样的:
$ .ajax({ 网址:网址, 类型:" GET", dataType:" json", 成功:功能(xhrData){ oTest1 = xhrData; promise.resolve();}}); var readyToGo = function(){ jQuery.sap.log.error(oTest1);}; jQuery.when(promise).done()。then(jQuery.proxy(readyToGo,this));
此代码正在运行,并且变量正常。 仍在运行旧代码,调试器将生成以下代码:
var-error.jpg (286.4 kB)
从SO复制解决方案:
"由于
oTest1
不在范围内,因此屏幕截图中的代码出错。作用域是在创建函数时确定的,由于函数中未使用
oTest1
变量,因此它不在作用域中。在通过使用调试器读取变量创建函数之后,尝试将其添加到作用域。 为时已晚。
在
debugger
之前添加console.log(oTest1)
,它将在范围内。"您好,感谢您的回复( 刚刚看到了这个。)
这很新,我实际上不知道jQuery.proxy方法如何工作的技术细节,但是我在这里有一个问题。
PS:在遵循SO建议并使用oTest1插入代码之后,一切正常。
我认为问题是因为您使用的是jQuery.proxy方法。
该代理方法将回调内的上下文作为Controller切换到" this"。 您可以测试打印/访问this.oTest1吗?
如果我们可以利用ES6箭头功能和var/let/const语法,那么一切都应该更好,但是我们对IE的支持仍然很困难:(
一周热门 更多>