javascript中的范围。父范围变量不保留值

时间:2015-11-23 04:32:23

标签: javascript

我是javascript的新手..已经通过多个范围相关的博客和stackoverflow上的几个答案..但不知道为什么这个代码不起作用..

 function checkPhoneEmail(element, index, array) {
    var _contact = {};
    var _phone_empty = true;
    var _email_empty = true;
    var _phones_to_store = [];
    var _emails_to_store = [];
    var _prev_phone_number;
    var _phone;
    var i;
    //function to check if this phone 
    // should be included
    function checkMobilePhone(ph_element) {
        var _match;


        _match = ph_element.type.match(/mobile/i);
        if (_match && ph_element.value.length >= 10 && !(ph_element.value.match(/^800/) || ph_element.value.match(/^1800/) || ph_element.value.match(/^1-800/))) {
            return true;
        };
        return false;
    };

    if (!_.isEmpty(element.phoneNumbers)) {

        for (i = 0; i < element.phoneNumbers.length; i++) {
            console.log('prev num: ' + _prev_phone_number);
            console.log('curr num: ' + element.phoneNumbers[i].value)
            if (!_.isEqual(_prev_phone_number, element.phoneNumbers[i].value)) {
                if (checkMobilePhone(element.phoneNumbers[i])) {
                    _phone = {
                        id: element.phoneNumbers[i].id,
                        value: element.phoneNumbers[i].value
                    };
                    _phones_to_store.push(_phone);
                    console.log('phone to store: ' + element.phoneNumbers[i].value)
                };
            };
            _prev_phone_number = element.phoneNumbers[i].value;
            console.log('prev1 num: ' + _prev_phone_number);
        };

        _phone_empty = false;
    };

    if (!_.isEmpty(element.emails)) {

    };

};

为什么没有设置_prev_phone_number?我在prev1 num..but看到它。但是当你寻找下一个元素时,它设置回未定义...我的理解是不创建一个新的范围?这是不正确的?

我正在尝试从手机通讯录阵列中删除重复项(来自cordova联系人)并进行一些非常基本的检查以消除除移动应用程序的有效美国移动号码之外的所有号码。如果联系人中有多个条目,则使用上述逻辑同一个电话号码的联系人,我看到重复。用foreach和_.uniq上面的逻辑结果......但结果相同......

感谢任何帮助。

示例数据:

{
    "id" : "1916",
    "rawId" : "1911",
    "displayName" : "John Doe",
    "name" : {
        "familyName" : "Doe",
        "formatted" : "John Doe",
        "givenName" : "John"
    },
    "nickname" : null,
    "phoneNumbers" : [{
            "type" : "mobile",
            "value" : "+1 999 666 9175",
            "id" : "11994",
            "pref" : false
        }, {
            "type" : "mobile",
            "value" : "+1 999 666 9175",
            "id" : "12001",
            "pref" : false
        }
    ],
    "emails" : null,
    "addresses" : null,
    "ims" : null,
    "organizations" : null,
    "birthday" : null,
    "note" : "",
    "photos" : null,
    "categories" : null,
    "urls" : null
}

2 个答案:

答案 0 :(得分:0)

for循环不会创建自己的范围。问题是您尝试使用未定义的值登录控制台。

for (i = 0; i < element.phoneNumbers.length; i++) {
        //_prev_phone_number is undefined here.
        console.log('prev num: ' + _prev_phone_number); 
        console.log('curr num: ' + element.phoneNumbers[i].value)
        if (!_.isEqual(_prev_phone_number, element.phoneNumbers[i].value)) {
            if (checkMobilePhone(element.phoneNumbers[i])) {
                _phone = {
                    id: element.phoneNumbers[i].id,
                    value: element.phoneNumbers[i].value
                };
                _phones_to_store.push(_phone);
                console.log('phone to store: ' + element.phoneNumbers[i].value)
            };
        };
        //This is the first time you have defined _prev_phone_number
        _prev_phone_number = element.phoneNumbers[i].value;
        console.log('prev1 num: ' + _prev_phone_number);
    };

在将其记录到控制台之前,您应该检查是否已定义_prev_phone_number

if(_prev_phone_number){
  console.log('prev num: ' + _prev_phone_number);
}

这将确保您不记录未定义的值。

答案 1 :(得分:0)

为什么不只是访问element.phoneNumbers[i-1].value而不是使用变量> Visual C++ 2015 00322-20000-00000-AA582 Microsoft Visual C++ 2015 > Node.js Tools 1.1.30910.02 Adds support for developing and debugging > Node.js apps in Visual Studio > > Node.js Tools - Profiling 1.1.30910.02 Profiling support for Node.js > projects. ?无需为它引入新变量。

如果这不起作用,那么有些东西会破坏你的对象,我们需要更深入地看待它。