2015-02-11 2 views
3

Статья Википедии о первоклассных гражданах гласит, что «некоторые авторы» считают, что функции являются только первоклассными гражданами на языке, если язык supports their creation at run-time. Этот article, написанный Джеймсом Когланом, явно называет функции первоклассных граждан - независимо от того, знает ли он о споре по критериям первоклассного, я не знаю.Можно ли создавать функции во время выполнения в Javascript?

Вот мои вопросы:

  1. Использование дополнительных критериев «создания во время выполнения», являются гражданами процедуры JavaScript первого класса?

Стоит отметить, что на основании более обобщенных критериев (применительно к другим объектам на свободе), функции JavaScript очень очевидно, граждане первого класса, а именно они могут быть переданы вокруг как переменные; поэтому я чувствую, что упомянутые выше критерии добавляют интересную динамику - или, по крайней мере, уточняющую динамику - к разговору, который не является - как пишет один пользователь - «произвольный».

  1. Если да, то как создается функция во время выполнения в JavaScript (это то, что мы называем обещаниями, обратными вызовами, анонимными и т. Д.)?
  2. Если нет, то, что создает функция функции во время выполнения на другом языке?
+0

Этот вопрос [SO вопрос] (http://stackoverflow.com/questions/20129236/creating-functi ons-dynamic-in-js) довольно похож на ваш вопрос. – AWolf

+0

@ColeJohnson, это на самом деле не технически правильно. Прочтите о споре о первоклассных функциях граждан: http://programmers.stackexchange.com/questions/39742/when-is-a-feature-considered-a-first-class-citizen-in-a-programming -язык-р (например, в интернете больше богатства) – Thomas

ответ

12

Функции могут создаваться динамически с помощью Function constructor

var adder = new Function('a', 'b', 'return a + b'); 

adder(3, 4); // returns 7 

Более подробно, это может быть использовано, чтобы применить произвольный бинарный оператор:

function make_binary_fun(operator) { 
    return new Function('a', 'b', 'return a ' + operator ' b'); 
} 
var adder = make_binary_fun('+'); 
var multiplier = make_binary_fun('*'); 
+1

Правда, но редко используется в реальной жизни; пример в ответе Самуэля Эдвина Уорда лучше, потому что он демонстрирует, что функции являются первоклассными с помощью обычных языковых конструкций, используемых в повседневном JavaScript, а не через конструкцию, которая редко используется и довольно зла (по тем же причинам, что и 'eval'). –

+1

Вопрос не совсем ясен о том, что это значит. Этот ответ создает новые замыкания одной и той же функции, а не новые функции.Я не думаю, что вопрос был о том, что используется в реальной жизни, а просто в общем вопросе о дизайне и возможностях языка. – Barmar

+1

Это currying, и технически делает новую функцию каждый раз, когда вы ее называете. Не уверен, почему это не дает правильного ответа. (Я поддерживал оба btw) – Marc

6

Вот пример функции, которая создает функцию во время выполнения в JavaScript:

function makeIncrementer(value) { 
    return function(x) { 
     return x+value; 
    } 
} 

Он принимает значение и возвращает функцию, которая добавляет, что значение его ввода.

Вот некоторые примеры того, как назвать:

var f = makeIncrementer(5); 
f(2); // 7 
f.call(null, 3); // 8 
f.apply(null, [4]); /// 9 
var object = {}; 
object.increment = f; 
object.increment(5); // 10 
+0

@SamuelEdwinWard просто хочет распознать «вслух» как первый ответ, а также ответ, который наилучшим образом соответствует вопросу. Честно говоря, выбор между вашим и другим был произвольным. Спасибо за то, что вы ответили. – Thomas

+0

@Thomas Спасибо. Ответ Бармара определенно хорош. –