功能内的可变范围

2020-09-13 10:25发布

         点击此处--->   EasySAP.com群内免费提供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)

         点击此处--->   EasySAP.com群内免费提供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)
付费偷看设置
发送
3条回答
Bunny_CDM
1楼 · 2020-09-13 10:57.采纳回答

从SO复制解决方案:

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

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

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

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

SKY徐
2楼-- · 2020-09-13 10:42

您好,感谢您的回复( 刚刚看到了这个。)

这很新,我实际上不知道jQuery.proxy方法如何工作的技术细节,但是我在这里有一个问题。

PS:在遵循SO建议并使用oTest1插入代码之后,一切正常。

lukcy2020
3楼-- · 2020-09-13 10:42

我认为问题是因为您使用的是jQuery.proxy方法。

该代理方法将回调内的上下文作为Controller切换到" this"。 您可以测试打印/访问this.oTest1吗?

如果我们可以利用ES6箭头功能和var/let/const语法,那么一切都应该更好,但是我们对IE的支持仍然很困难:(

一周热门 更多>

点击此处---> EasySAP.com 一起学习S4 HANA ...

相关问答