2015-10-13 6 views
0

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

Я понимаю, как я пишу это, что могу просто передать ссылку на функцию.

Мой вопрос в том, имеет ли шаблон «имя функции передачи как строка» общее имя? И, это анти-шаблон - должен ли я вообще использовать ссылки, когда это возможно?

+0

Можете ли вы показать пример того, что вы делаете? Причина, по которой вы не передаете ссылки? – epascarello

+0

@epascarello - нет причины точно, это просто то, что я заметил, можно сделать, и я играл с ним. Там не используется случай, который заставляет это поведение. – Ben

ответ

2

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

function doThisThing() {} 
var action = 'doThisThing'; 

Вы видите, что я на самом деле создаю две вещи в памяти с указателем на каждого.

var action = function() {} 

Здесь я создал отдельный элемент в памяти, и action только указатель на него. Тогда это супер легко просто

if (action) action(); 

или даже короче

action && action(); 

Это так намного проще просто передать ссылку вокруг. Это просто: ссылка. У этого есть мало-на-нет накладных расходов, и это намного проще.

+1

Спасибо, Дэн, это имеет смысл. Чтобы добавить в список анти-шаблонов, читаемость (и обслуживание) также ухудшается! – Ben

0

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

OK

var obj = { 
    foo: function() {}, 
    bar: function() {}, 
    execute: function(fnName) { 
     this[fnName](); 
    } 
}; 

obj.execute("foo"); 

Bad

var obj = { 
    foo: function() {}, 
    bar: function() {}, 
    execute: function(fnName) { 
     eval("obj." + fnName + "()"); 
    } 
}; 
+0

Нет, нет eval, просто называя его как свойство объекта, например. 'OBJ [fnName]()'. – Ben

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