Конструктор функций и функциональное программирование

Я пытался понять функциональное программирование и конструктор функций.

Сначала, пройдя через конструктор функции, я прошел через Документы Firefox и точка обучения

Я вижу, что они использовали такой конструктор функций

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

console.log(sum(2, 6)); //This prints 8 

Итак, мой первый вопрос: эта строка для меня не имеет смысла.

('a', 'b', 'return a + b');  

Вот функция, принимающая строки в качестве аргумента, что ли? во-вторых, я знаю, что объявление функции здесь предшествует ES6, но как они могут вернуть что-то подобное?

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

let reader = new FileReader();
reader.readAsDataURL(this.state.image).reader.onload = e => {
  console.log(e)
}

но это бросает ошибка типа, в то время как что-то вроде этого абсолютно работает

 let reader = new FileReader();
 reader.readAsDataURL(this.state.image);
 reader.onload = e => {
   console.log(e)
 }

Вопрос: Может ли кто-нибудь объяснить мой конструктор функции и помочь мне, почему приведенная выше строка кода выдает ошибку?

var sum = new Function('a', 'b', 'return a + b'); ... то же самое, что ... var sum = function(a, b) { return a + b; } - не уверен, что вы имеете в виду под Вот функция, принимающая строки в качестве аргумента, что ли?
Bravo 31.10.2018 12:04

@Bravo Я понял, но я пытаюсь сказать, почему они использовали вот эти ''?

anny123 31.10.2018 12:05

Что касается первой части вашего вопроса, MDN дает очень хорошее объяснение того, что происходит: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Последний аргумент конструктора функции - это тело функции

OliverRadini 31.10.2018 12:05
reader.readAsDataURL(this.state.image) возвращает undefined ... и undefined не имеет вашей переменной reader в качестве свойства (у него вообще нет свойств)
Bravo 31.10.2018 12:06

@VarunBindal - потому что аргументы, переданные в new Function, являются строками

Bravo 31.10.2018 12:06

Я не уверен, какое отношение "конструктор функций" JS имеет к функциональному программированию. Кроме того, на самом деле это не одобряется, и на это есть веские причины (посмотрите, почему eval устарел / не рекомендуется - использование new Function(...) таким образом в основном то же, что и eval).

Robin Zigmond 31.10.2018 12:10

@Bravo Нет, неопределенное значение не возвращается. скорее он возвращает что-то вроде этого FileReader {readyState: 1, result: "", error: null, onloadstart: null, onprogress: null, …} error: null onabort: null onerror: null onload: ƒ (e) onloadend: null onloadstart: null onprogress: null readyState: 2 result: "data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/7QCcUGhv‌​dG9zaG9wIDMuMAA4QklN‌​BAQAAAAAAIAcAmcAFHFr‌​NU43ZUU0VEIzY3dJU283‌​bVZlHAIoAGJGQk1EMDEw‌​M..

anny123 31.10.2018 12:10

@VarunBindal ну, если вы не передаете строки в new Function(), тогда у вас должен быть фактический переменные. Подумайте об этом - вы хотите создавать функции, которые, вероятно, будут вызываться где-то еще, поэтому вы не можете давать им переменные, которыми вы в настоящее время обладаете, если вы хотите вызывать их с другими. Следовательно, вы даете строки, которые будут определять имена параметров, и вам нужно будет ссылаться на них по имени. Если вы попытаетесь выполнить new Function(a, b, "return a + b"), то откуда вы узнаете, что a - это параметр, когда JS просто найдет его текущее значение?

VLAZ 31.10.2018 12:11

@RobinZigmond ничего из того, что в этом вопросе, действительно не связано с функциональным программированием. Думаю, помимо функций.

VLAZ 31.10.2018 12:13

Причина, по которой reader.readAsDataURL(this.state.image).reader.onload не работает, но работает тот, у которого есть ввод, в том, что JS автоматически вставляет точку с запятой. Итак, тот, у кого новая линейка, - reader.readAsDataURL(this.state.image);reader.onload. Если readAsDataURL возвращает ридер (в документации не сказано), вы можете создать цепочку следующим образом: reader.readAsDataURL(this.state.image).onload

HMR 31.10.2018 12:18

@vlaz Не уверен, что вы имеете в виду под у вас должны быть фактические переменные. Подумайте об этом - вы хотите создавать функции, которые, вероятно, будут вызываться в другом месте, поэтому вы не можете давать им переменные, которыми вы в настоящее время обладаете.. Я могу сделать что-то вроде этого let a = "apple" let b = "anything" function something (a, b) { return a + b } console.log(something(2,4)), который по-прежнему будет печатать 6, а если я напечатаю console.log(something(3,4)), он напечатает 7. Я уверен, что вы определенно пытаетесь объяснить что-то еще, что для меня не имеет смысла. Не могли бы вы попробовать подробно в разделе ответов?

anny123 31.10.2018 12:25

Правильно, вы можете это сделать. Но при создании функции через new Function и передаче a и b, когда они не являются строками, JS не обрабатывает их иначе, чем вызовы других функций, поэтому значения будут разрешены и заменены. Вы бы позвонили new Function("apple", "anything", "return a + b")

VLAZ 31.10.2018 12:30

@VarunBindal - значит, let x = reader.readAsDataUrl(this.stage.image); console.log(x === undefined); регистрирует для вас false?

Bravo 31.10.2018 21:29
1
13
106
0

Другие вопросы по теме