underscore.js TypeError: Illegal Invocation


1

Здравейте колеги, имам следния код 

var    students = [1,2,3,4,5];

_.each(students, console.log);
 
и получавам TypeError: Illegal Invocation в underscore.js, ред 100. 
 
библиотеката я дръпнах от github-a, който е посочен на сайта им, а реферирането в HTML-a си е ок. 
Някой да има идея какво може да е? Че вече 1 час гледам тъпо и не разбирам къде греша
 

 




Отговори



2

Здравейте,

нейде вътрешно console.log използва this. Когато подадеш console.log като callback, се губи стойността на this и гърми. С alert работи, тъй като явно не използва this.

Начина да го направиш е:

_.each(students, console.log.bind(console));

или както са написали колегите:

_.each(students, function(student) { console.log(student) });

Поздрави,

Дончо Минков


от DonchoMinkov (12706 точки)


0
Интересно. Би било добре да се оправи и в презентацията, защото предполагам, че доста хора, които за пръв път се сблъскват с underscorejs, ще си блъскат главата. Говоря за частта:
var numbers = [1, 2, 3, 4, 5, 6, 7, 8]; _.each(numbers, console.log); _.each(numbers, function(item) { console.log(item); } //log all the numbers
Поздрави!

от SStoyanov1 (1324 точки)

0
то проблема не е в underscore-a а в прости разбирания как се bind-ват фукнции, същото ще се случи ако се опиташ да го направиш да речем и със setTimeout

от paveld3 (17458 точки)


3
Пробвай да го извикаш като функция:
_.each(students, function(student) { console.log(student) };

от SStoyanov1 (1324 точки)


0
Да, така работи, но защо иначе да не иска при положение, че би трябвало


0
Нямам обяснение. Странното е, че така работи:
_.each([1, 2, 3], alert);

от SStoyanov1 (1324 точки)


0

Моята версия е че се изисква референция към функция която не е закачена към обект. И съответно ако си направим такава си работи.
var students = [1, 2, 3, 4, 5];

var log = function (st) {
        console.log(st);
    }
_.each(students, log);
 
Edit: Май не съм прав. Сам се опровергах.

от d.brezoev (212 точки)


0
SideNode: използвайте lodash вместо underscore - може да потърсите сравнение между двете - като цяло функциите им са еднакви, но lodash perform-ва значително по - добре
(теория на конспирацията) - по доброто представяне на lodash може да се дължи на факта че повечето хора тестват js performance в jsperf.... а човекът който прави lodash е същия, който поддържа и jsperf :D

от paveld3 (17458 точки)


0
Павка, спорно е, кое работи по-добре. ;) Принципно се твърди, че lazy.js работи по-добре и от underscore и от lodash...

от DonchoMinkov (12706 точки)

0
ами при нас за всичко което сме тествали работи по бързо lodash :)

от paveld3 (17458 точки)