document.title - «Обычные» функции против функциональных переменных в JavaScript



js sort (4)

Я знаю, что разница между ними заключается в том, что именованные функции работают везде, независимо от того, объявили ли вы их, а функции в переменных - нет.

a();//works   
function a(){..}

работает

a();//error
var a=function(){..}

не работает, но если вы позвоните после объявления

var a=function(){..}
a();//works

На этот вопрос уже есть ответ здесь:

Есть ли разница между

function MyFunc() {
    // code...
}

а также

var MyFunc = function() {
    // code...
};

в JavaScript?


Внешне нет никакой разницы, поэтому вы можете использовать оба формата в своем коде.

Для переводчика JS это отличается, хотя.

Первый - именованный функционал.

Вторая - это анонимная функция, которая присваивается переменной.

Кроме того, во время отладки вы не получите имя второй функции в трассировке стека.


Эта статья может ответить на ваш вопрос: Неоднозначность объявления функций JavaScript .

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

(посмотрите на комментарии, которые тоже могут получить полезную информацию)


Ознакомьтесь с этим эталоном: http://jsben.ch/#/bWfk9

В моих предыдущих тестах, где скорость была главной проблемой, я обнаружил

JSON.parse(JSON.stringify(obj))

быть самым быстрым способом глубокого клонирования объекта (он выдает jQuery.extend с установленным флагом true на 10-20%).

jQuery.extend довольно быстро, когда для флага глубокого значения установлено значение false (мелкий клон). Это хороший вариант, поскольку он включает в себя некоторую дополнительную логику для проверки типов и не копирует неопределенные свойства и т. Д., Но это также немного замедлит вас.

Если вы знаете структуру объектов, которые вы пытаетесь клонировать или можете избежать глубоких вложенных массивов, вы можете написать простой цикл for (var i in obj) чтобы клонировать ваш объект при проверке hasOwnProperty, и он будет намного быстрее, чем jQuery.

Наконец, если вы пытаетесь клонировать известную структуру объекта в горячем цикле, вы можете получить MUCH MUCH MORE PERFORMANCE, просто вставив процедуру клонирования и вручную создав объект.

for..in отслеживания JavaScript сосать при оптимизации for..in циклов ... и проверки hasOwnProperty также замедлит вас. Ручной клон, когда скорость является абсолютной необходимостью.

var clonedObject = {
  knownProp: obj.knownProp,
  ..
}

Остерегайтесь использования JSON.parse(JSON.stringify(obj)) для объектов Date - JSON.stringify(new Date()) возвращает строковое представление даты в формате ISO, которое JSON.parse() не конвертирует обратно к объекту Date . См. Этот ответ для получения более подробной информации .

Кроме того, обратите внимание, что в Chrome 65, по крайней мере, нативный клонирование - это не путь. Согласно этому JSPerf , выполнение собственного клонирования путем создания новой функции почти на 800 раз медленнее, чем использование JSON.stringify, которое невероятно быстро распространяется по всем направлениям.





javascript