Странное поведение call() и apply()

346
25 января 2017, 00:34

При написании скрипта столкнулся с такой проблемой: В ниже прикрепленном фрагменте упрощенного кода в который я помечу нужный участок, при вызове через apply(), на втором прохождении появляется ошибка:

Uncaught TypeError: CreateListFromArrayLike called on non-object

То есть первый раз он срабатывает корректно. А во втором прохождении происходит ошибка, ещё до входа в функцию. При этом, если apply() заменить на call(), то всё начинает работать корректно. Возможно я не до конца понимаю разницу в этих методах. Вроде разница лишь в динамическом диапазон аргументов у apply(). Хотя возможно я что то путаю.

Был бы рад если мне пояснили причину такого поведения. Вот тут весь код. Заранее спасибо.

function MetaRow(name,value){
    this.name = name;
    this.value = value;
}
function MetaGroup(name){
    this.name = name;
    this.items = {};
    this.groups = {};
}

MetaGroup.prototype.set = function(key,meta,replace = false)
{
    if(meta instanceof MetaRow){
        //Добавляем строку
    }
    else if(meta instanceof MetaGroup){
        //Добавляем группу
    }
}
function FormMeta(forms)
{
    this.forms = forms;
    this.Global = new MetaGroup();
    FormMeta.prototype.update.apply(this);
}
FormMeta.prototype.get = function(key)
{
    return this.Global.groups[key] != undefined ? this.Global.groups[key] : this.Global.groups['main'];
}
FormMeta.prototype.pickRadio = function(form)
{
    var glob = this;
    $(form).find('radio-group').each(function(i,val){
        var targetGroup,mid,rid,rname;
        //Далее я заполняю переменные ничего интересного

        //Вот на это строке в момент вызова apply() генерируется ошибка 
        FormMeta.prototype.get.apply(glob,mid).set(rid, new MetaRow(rname),true);
})
Answer 1

http://www.w3schools.com/js/js_function_invocation.asp - apply принимает параметры вызова в виде массива:

FormMeta.prototype.get.apply(glob, [mid]).set(rid, new MetaRow(rname), true);

или

FormMeta.prototype.get.call(glob, mid).set(rid, new MetaRow(rname), true);
READ ALSO
Автовысота модального окна fancybox

Автовысота модального окна fancybox

Имеется модальное окно fancyboxКонтента в модальном окне может быть много

298
Как подключить owl-carousel (browserify)?

Как подключить owl-carousel (browserify)?

В консоли вижу ошибку вида : bundlejs:11899 Uncaught TypeError: Cannot read property 'fn' of undefined

574
Лучшая JS библиотека на базе PJAX с анимацией

Лучшая JS библиотека на базе PJAX с анимацией

Начал подробнее изучать вопрос построения сайта без перезагрузки страницПервым делом поработал с чистым PJAX

335
почему падает slimerjs при wait?

почему падает slimerjs при wait?

У меня есть в коде такая рекурсия

311