2016-10-12 3 views
2

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

JQuery:

$("p").on("click", function clickHndlr() { 
    /* body...*/ 
}); 

Узел

var EventEmitter = require('events').EventEmitter, 
    emitter = new events.EventEmitter(); 

    emitter.on('customEvent', function customEventHndlr (message, status) { 
     /* body...*/ 
    }); 

Vanilla JS:

button.addEventListener('keypress', function buttonHndlr() { 
    /* body...*/ 
}); 

Но что об объекте?

var starShipChecker = (function() { 
    var publicAPI = { 
    checkForWarpDrive : function(starShip){ 
     if(!starShip.hasOwnProperty('warpDrive')) { 
      starShip.warpDrive = undefined; 
      console.log('Your star-ship, the ' + starShip.name + ', now has warp-drive!' + 
      '\n' + 'Use the addWarpDrive method to apply the maximum warp relevant to your ship Class...'); 
     } else { 
      console.log('Your star-ship, the ' + starShip.name + ', has warp-drive already!' + 
      '\n' + 'But use the addWarpDriveMaxLevel method to apply the maximum warp relevant to your ship Class...'); 
     } 
    }, 
    addWarpDriveMaxLevel : function(){} 
    }; 
    return publicAPI; 

})(); 

Вы получите такую ​​же выгоду? Или это другое, потому что это методы?

checkForWarpDrive : function checkWarpDriveLikeYouWereScotty(starShip){ /* body...*/}, 
addWarpDriveMaxLevel : function addWarpDriveLikeYouWereScotty(){ /* body...*/} 
+1

То же самое. Когда вы смотрите на трассировку стека, есть хороший шанс, что он просто скажет что-то вроде «анонимной функции», если вы не дадите ему имя. Назовите ли вы все свои функции, чтобы вы могли видеть, что их имена в трассировке стека зависят от вас. Некоторые люди, некоторые люди этого не делают. –

+1

Ну, если анонимная функция имеет имя, это уже не анонимность, не так ли? – Feathercrown

+1

Я бы сказал, что польза исчезла, поскольку методы не являются, в конце концов, анонимными. –

ответ

4

Да. Такие же преимущества (and more) есть.

Однако двигатели/отладчики становятся все более интеллектуальными и неявно называют функцию ключом свойства объекта, частью которого они являются. ES6 даже требует этого (отметьте .name property). Но если вы используете ES6, вы, вероятно, будете использовать method definition :-)

+1

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

+1

@Turk действительно - назовите их, если им нужно имя. Я бы сказал, что в случае OP различные обработчики с ошибками на самом деле не так ценны. В трассировке стека вы уже сможете увидеть, что событие называется функцией - это _общий_ обработчик (или hndlr). Объясняя, что не за горами 'i ++ // inrease i by 1' - это повторяющаяся информация, которая уже известна. Говорить, что это обработчик «щелчок» или «customEvent», не проясняет ничего. – vlaz

+1

@vlaz, который может быть правдой для собственного события (в примере «ваниль»), но это может быть не так очевидно для jQuery или эмитентов событий Node. Известное имя помогает узнать, где в стеке вызовов вызывается собственный код. – Bergi

Смежные вопросы