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

查看:95
本文介绍了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数量)


解决方案

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

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();//调用

这篇关于javascript - 在闭包中,无法使用数组的length属性?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆