aardio 官方社区

用户名  找回密码
 注册会员

QQ登录

只需一步,快速开始

帖子
查看: 19388|回复: 4

tab加载子窗口同名函数被覆盖的疑问与解决

[复制链接]

34

主题

29

回帖

390

积分

新手入门

积分
390
发表于 2018-1-17 23:47:40 | 显示全部楼层 |阅读模式
问题:发现在tab选项夹里加载多个子窗口时,AB两个子窗口里有相同的函数名funA,会被后加载的覆盖,即使在每个子窗口的函数里加上 var 一样会被覆盖.
解决:只有在子窗口函数前加上"winform."变成成员函数 winform.funA = function{} 才不会被覆盖.
  1. var frmA = mainForm.tab.loadForm("\res\A.aardio");
  2. var frmB = mainForm.tab.loadForm("\res\B.aardio");
  3. var frmC = mainForm.tab.loadForm("\res\C.aardio");
  4. var frmD = mainForm.tab.loadForm("\res\D.aardio");
复制代码


疑问:winform的变量加var变成了局部变量,为什么函数前加了var没变成winform的成员函数,为什么还是会被覆盖?

166

主题

2153

回帖

1万

积分

管理员

积分
13051
发表于 2018-1-18 01:15:58 | 显示全部楼层
用var 定义的函数不可能相互覆盖,根本就在不同的调用栈里。

另外,“加了var没变成winform的成员函数”.......这句话说的是有多离谱,一个新手说这样的话还能理解,你用aardio多久了?! var定义的是局部变量,跟成员函数的概念没有任何关系。

基础知识一定要重视,不然会浪费你自己更多的时间去踩坑。

34

主题

29

回帖

390

积分

新手入门

积分
390
 楼主| 发表于 2018-1-18 09:11:51 | 显示全部楼层
本帖最后由 lacker 于 2018-1-18 09:12 编辑

刚做了个demo,发现函数前加了var可以不被覆盖了,可能是修改后没注意保存再运行.
变量前加 var 叫局部变量,函数前加 var 叫什么,有局部函数这种说法吗?

附上DEMO:
主窗口:
  1. import win.ui;
  2. /*DSG{{*/
  3. mainForm = win.form(text="aardio form";right=973;bottom=619)
  4. mainForm.add(
  5. tab={cls="tab";left=45;top=36;right=917;bottom=549;edge=1;z=1}
  6. )
  7. /*}}*/

  8. //加var变成局部
  9. var frmChild,wb = mainForm.tab.loadForm("\res\A.aardio");
  10. var frmChild,wb = mainForm.tab.loadForm("\res\B.aardio");

  11. mainForm.enableDpiScaling();
  12. mainForm.show();

  13. return win.loopMessage();
复制代码


子窗口A:
  1. import win.ui;
  2. /*DSG{{*/
  3. var winform = win.form(text="窗口A";right=759;bottom=469;parent=...)
  4. winform.add(
  5. buttonA={cls="button";text="buttonA";left=178;top=178;right=303;bottom=220;z=1}
  6. )
  7. /*}}*/

  8. //加var变成局部,防止被其它窗口同名函数覆盖
  9. var funA = function(){
  10.         winform.msgbox( "这是窗口A中的funA函数" );
  11. }

  12. winform.buttonA.oncommand = function(id,event){
  13.         funA()
  14. }

  15. winform.enableDpiScaling();
  16. winform.show();

  17. win.loopMessage();
复制代码


子窗口B:
  1. import win.ui;
  2. /*DSG{{*/
  3. var winform = win.form(text="窗口B";right=759;bottom=469;parent=...)
  4. winform.add(
  5. buttonB={cls="button";text="buttonB";left=243;top=158;right=396;bottom=200;z=1}
  6. )
  7. /*}}*/

  8. //加var变成局部,防止被其它窗口同名函数覆盖
  9. var funA = function(){
  10.         winform.msgbox( "这是窗口B中的funA函数" );
  11. }

  12. winform.buttonB.oncommand = function(id,event){
  13.         funA()
  14. }

  15. winform.enableDpiScaling();
  16. winform.show();

  17. win.loopMessage();
复制代码



12

主题

645

回帖

3938

积分

荣誉会员

子非魚、安知魚之樂

积分
3938
发表于 2018-1-18 11:55:40 | 显示全部楼层
本帖最后由 xauto 于 2018-1-18 11:58 编辑
刚做了个demo,发现函数前加了var可以不被覆盖了,可能是修改后没注意保存再运行.
变量前加 var 叫局部变量, ...

定义局部函数
函数也可以作为局部变量。局部函数像局部变量一样作用域限于当前语句块。

定义局部函数的基本语法:
var function 局部函数名字(形参,形参2,...) {
           //函数内部代码

           //多个返回值以逗号分隔,如果省略return语句,函数默认返回null空值。
           return 返回值,返回值2;
}

也可以使用赋值语句定义局部函数
var 局部函数名字 = function (形参,形参2,...) begin
    //函数内部代码

    //多个返回值以逗号分隔,如果省略return语句,函数默认返回null空值。
    return 返回值,返回值2;
end


帮助文件定义函数一节里面清楚的写着,这么久了连这个都没看过吗

3

主题

42

回帖

310

积分

二级会员

积分
310
发表于 2018-1-18 13:29:41 | 显示全部楼层
都不看帮助文档就来各种问,新技术要掌握,基础也一样要掌握,你在介绍局部变量的页面里找局部函数的定义可能找到么,这个时候就应该看函数的介绍。作用域的问题,多看看吧
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|aardio.com|aardio 官方社区 ( 皖ICP备09012014号 )

GMT+8, 2025-7-28 18:02 , Processed in 0.057499 second(s), 22 queries .

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表