Невозможно вызвать метод split из undefined - Вызывается из функции - PullRequest
2 голосов
/ 21 ноября 2011

У меня есть функция JS, которая вызывается при нагрузке, которая разбрасывает некоторые переменные, все это работает хорошо, но когда я вызываю функцию из другой функции, я получаю эту ошибку Cannot call method 'split' of undefined:

function loadInAttachmentsIntoSquads(){
    // eg: 5000,5000,5000,5000 > [5000][5000][5000]
    myAttachmentArray = currentAttachments.split(',');

    //eg: [5000][5000][5000] > [5][0][0][0]
    //myAttachmentForWeapon = myAttachmentArray[mySquadsIndex].split('');

    setupWeaponAttachments();
}


function setupWeaponAttachments(){

    myAttachmentForWeapon = myAttachmentArray[mySquadsIndex].split('');

    //if(mySquadsIndex == 0){
        if(myAttachmentForWeapon[1] == 1){ // if silencer is on? //first digit is always 5
            weaponAttachments.silencer = true;
        }
        else{
            weaponAttachments.silencer = false;
        }
        if(myAttachmentForWeapon[2] == 1){ // if silencer is on? //first digit is always 5
            weaponAttachments.grip = true;
        }
        else{
            weaponAttachments.grip = false;
        }
        if(myAttachmentForWeapon[3] == 1){ // if silencer is on? //first digit is always 5
            weaponAttachments.redDot = true;
        }
        else{
            weaponAttachments.redDot = false;
        }

    // -- applies visuals -- \\
    applyWeaponAttachments();
}

Если я вызываю setupWeaponAttachments() из другой функции, я получаю эту ошибку ... почему?

Ответы [ 2 ]

3 голосов
/ 21 ноября 2011

В следующем:

> function loadInAttachmentsIntoSquads(){
>     
>     myAttachmentArray = currentAttachments.split(',');
> 
>     setupWeaponAttachments(); 
> }

Идентификатор currentAttachments используется так, как если бы это была глобальная переменная.Если ему не было присвоено значение, или его значение не является строкой, во время вызова функции возникнет ошибка.

Поэтому исправление состоит в том, чтобы убедиться, что в нем есть строказначение:

function loadInAttachmentsIntoSquads(){
    if (typeof currentAttachments != 'string') return;
    ...
}

или устранить ошибку другим способом.

Кроме того, когда вы делаете все эти блоки if..else, учтите:

weaponAttachments.silencer = myAttachmentForWeapon[1] == 1;
weaponAttachments.grip     = myAttachmentForWeapon[2] == 1;
weaponAttachments.redDot   = myAttachmentForWeapon[3] == 1;

Это не будет быстрее, но кода для написания и чтения намного меньше.

0 голосов
/ 21 ноября 2011

Вы неправильно понимаете / неправильно используете правила области видимости JavaScript.

Попробуйте передать массив, который вы разделяете явно и последовательно, и это должно решить вашу проблему, а также сохранить глобальное пространство имен менее загроможденным:

Сначала передайте вложения в первой функции явно:

function loadInAttachmentsIntoSquads(currentAttachments) {
    var myAttachmentArray = currentAttachments.split(',');
    setupWeaponAttachments(myAttachmentArray);
}

Обратите внимание на несколько вещей, которые я делаю выше. Во-первых, я добавляю currentAttachments аргумент к функции, а не просто полагаюсь на ранее объявленную глобальную переменную. Во-вторых, я объявляю myAttachmentArray как локальную переменную, используя ключевое слово var. Объявление переменных с помощью var объявляет их в локальной области видимости; в противном случае объявляет их в глобальном масштабе. В-третьих, я вручную передаю массив в функцию setupWeaponAttachments, в которой я также получу аргумент:

function setupWeaponAttachments(myAttachmentArray) {
    var myAttachmentForWeapon = myAttachmentArray[mySquadsIndex].split('');
    // [...]
}

Обратите внимание, что я снова правильно объявил переменную myAttachmentForWeapon в локальной области видимости.

Если вы будете более осторожны с управлением областью действия и правильно определите функции для получения необходимых им аргументов и работы с ними, вы избавите себя от головной боли в будущем, и у вас будет значительно меньше таких проблем.

...