搜尋

首頁  >  問答  >  主體

javascript - 在闭包中,无法使用数组的length属性?

如下列示例代码:
我本意,是想封装一个页面的对象,对外提供一个getWidgetLength()的公共方法,打印控件数量。
但是在闭包当中,竟然没办法获取数组.length的值,跪求各位大神指教!

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <script type="text/javascript">
            var PageObj = (function(){
                //私有属性:页面的控件名集合
                var widgetNames; //一开始没有实例化
                function initPage(){
                    //调用公共的Util包,它给我返回的,竟然是一个Map (- -!!!
                    //widgetNames = WidgetUtil.getAllWidget();
                    widgetName = {"001":"loginName","002":"loginPwd","003":"loginCode","004":"loginBtn","005":"clearBtn"};
                }
                
                return {
                    //公共方法:打印页面控件的数量
                    widgetLength : function(){
                        try{
                            //求解:widgetName不能使用length、shift()、slice()等属性/方法,
                            console.info(widgetNames.length);    
                        }catch(e){
                            console.error(e);
                        }
                    }
                }
            })();
            
            PageObj.widgetLength();//调用
        </script>
    </body>
</html>

补充说明:

  1. 非常抱歉,示例确实存在代码拼写错误:应该是console.info()

  2. 经过检查项目代码发现,我遇到的实际问题是: Object对象的length如何获取? (大神们,你们有没有封装获取对象length的通用方法?不管Array、Object都能得到他的item数量)


天蓬老师天蓬老师2776 天前746

全部回覆(5)我來回復

  • 巴扎黑

    巴扎黑2017-04-11 13:27:49

    可以这样写,(你给的源码有错误,需要修改)

    var PageObj = (function(){
        //私有属性:页面的控件名集合
        var widgetNames; //一开始没有实例化
        function initPage(){
            //调用公共的Util包,它给我返回的,竟然是一个Map (- -!!!
            //widgetNames = WidgetUtil.getAllWidget();
            widgetNames = {"001":"loginName","002":"loginPwd","003":"loginCode","004":"loginBtn","005":"clearBtn"};
        }
        
        var length = function() {
            if(Object.keys) { return Object.keys(this).length;}
            
            var c = 0;
            for(k in this) {
                if(this.hasOwnProperty(k)) { c++;}
            }
            return c;
        }
        // or
        Object.prototype.length = length;
        return {
            //公共方法:打印页面控件的数量
            widgetLength : function(){
                try{
                    //求解:widgetName不能使用length、shift()、slice()等属性/方法,
                    console.info(length.call(widgetNames));
                    
                    //OR
                    console.log('method2',widgetNames.length());
                }catch(e){
                    console.error(e);
                }
            },
            initPage:initPage
        }
    })();
    
    PageObj.initPage();//调用
    PageObj.widgetLength();//调用

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-11 13:27:49

    Into是什么。。
    var PageObj = (function() {
        //私有属性
        var widgetNames = ["loginName", "loginPwd", "loginCode", "loginBtn", "clearBtn"];
        return {
            widgetLength: function() {
                window.console.log(widgetNames.length);
            }
        }
    })();
    
    
    PageObj.widgetLength();

    回覆
    0
  • 怪我咯

    怪我咯2017-04-11 13:27:49

    你的代码里面有很多问题,拼写的问题和用法的问题:

    最关键的问题在于;
    1.initPage函数没被调用,所以widgetNames并没有被初始化
    2.在initPage里面,widgetNames被初始化成了一个obj,而不是array,但是obj并没有length属性!!

    帮你改好了。

    var PageObj = (function(){
      //私有属性:页面的控件名集合
      var widgetNames; //一开始没有实例化
      function initPage(){
        //调用公共的Util包,它给我返回的,竟然是一个Map (- -!!!
        //widgetNames = WidgetUtil.getAllWidget();
        widgetNames = {"001":"loginName","002":"loginPwd","003":"loginCode","004":"loginBtn","005":"clearBtn", "length": 5};
      }
      initPage();
    
      return {
        //公共方法:打印页面控件的数量
        widgetLength : function(){
          try{
            //求解:widgetName不能使用length、shift()、slice()等属性/方法,
            console.info(widgetNames);    
            console.info(widgetNames.length);    
          }catch(e){
            console.error(e);
          }
        }
      }
    })();
    
    console.log(PageObj);
    PageObj.widgetLength();//调用

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-11 13:27:49

    我能想到的就是for in轮询一次然后每次执行代码的时候计数器自增

    let count=0;
    for(let i in widgetNames){
        count++;
    }

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-11 13:27:49

    widgetName似乎不是全局变量,所以无法去到值

    回覆
    0
  • 取消回覆