LINUX.ORG.RU

В чем сходство Function и Eval?

 


0

1

У крокфорда в good parts есть утверждение, что Function — это, почти то же самое что eval. Я копаюсь уже битый час, и не могу понять вообще, что у них общего. Насколько я понял, Function сразу компилируется в обычную анонимную ф-цию. И в дальнейшем, она ведет себя как обычная ф-ция, даже с сохранением лексического скопа в замыканиях.

fu=Function("var a=1; return function(){return(a)}")
console.log(""+fu)
//
//out:
//function anonymous() {
//var a=1; return function(){return (a)}
//}

inner_fu=fu()
console.log(inner_fu())
//out:
//1
Что же общего нашел крокфорд между ними? Покажите пример эквивалентного поведения, пожалуйста.



Последнее исправление: anonimous (всего исправлений: 1)

что Function — это, почти то же самое что eval

Это объяснение «на пальцах». Не нужно искать тут скрытый смысл и, конечно, они не эквивалентны.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Но я не понимаю этих пальцев. ничего похожего же нет вообще! С таким же успехом можно было сказать, что while похож на return, например. Похоже на бред, либо я чего-то не догнал:)

anonimous
() автор топика

Схожесь только с точки зрения применения. И с помощью эвала и с помощью Функшин можно взять строку с некоторым кодом и запустить. С эвалом сразу идёт компиляция или интерпретация и выполнение. А с функшин надо будет потом дёрнуть функцию.

То есть в реальном коде применения одинаковы. Ну конечно эвалом ещё парсят объекты и инжектят их, но надо ли оно в нормальном коде пихать в текущую область видимости всё подряд?

ixrws ★★★
()
Ответ на: комментарий от Dantix

Так Function не выполняет строку. Она просто подставляет ее содержимое в тело скомпилированной ф-ции

anonimous
() автор топика
Ответ на: комментарий от anonimous

ничего похожего же нет вообще!

Ну как нет? Там строка и тут строка, там выполняется и тут выполняется.

eval('console.log(2+2)')

Function('console.log(2+2)')()
no-such-file ★★★★★
()
Ответ на: комментарий от Dantix

Ну, ящетаю, это все равно что сказать, что обычная function эквивалентна eval, потому что из нее можно вернуть строку и совершить неподъемное действие — выполнить с помощью eval. Просто строка — туда же. Просто строка эквивалентна эвалу, ага. Пургу он метет, короче.

anonimous
() автор топика
Ответ на: комментарий от anonimous

что обычная function эквивалентна eval

Где он сказал, что эквивалентна? Это у ТС тупняк, никак не сообразит, что «почти тоже самое» - это речевой оборот для объяснения макакам нового явления на примере другого, уже известного.

no-such-file ★★★★★
()
Ответ на: комментарий от anonimous

не мог ошибиться,ясно же.:)

Он наверное и не знал, что есть существа использующие js и при этом менее развитые, чем макаки.

no-such-file ★★★★★
()
Ответ на: комментарий от Dantix

Ты что там запускаешь последним вызовом? undefined? Точка с запятой перед скобкой, кста. Объясни, что ты хочешь сказать этим?

anonimous
() автор топика
Ответ на: комментарий от anonimous

Давай по порядку, начнем с цитаты из Good Parts, с указанием главы и страницы, на которой ее можно найти.

Объясни, что ты хочешь сказать этим?

Если у тебя есть код, который хранится в строке ты можешь его выполнить как при помощи eval, так при помощи Function - в этом заключается их схожесть

Dantix ★★
()
Ответ на: комментарий от Dantix

с цитаты

Мне лень искать, книги под рукой нет.

так при помощи Function

При помощи Function строка не выполняется, насколько я понимаю, она упаковывается в ф-цию, компилиться, а потом выполняется функция. Это все если и похоже, то только тем, что выхлоп одинаковый. собственно, просто console.log(something) в этом смысле тоже самое. Любой JS-код, короче похож на eval хотя бы тем, что он, внезапно, выполняется.

anonimous
() автор топика
Ответ на: комментарий от anonimous

Любой JS-код

Ты ведь делаешь тоже самое, что и Крокфорд. Ты делаешь утверждение, которое на самом деле не всегда правда, но нормальные люди это нормально интерпретируют, в отличии от тебя.

Специально для тебя - я только что написал в виме js-код и не выполнил его, получается не любой JS-код похож на eval, мой вот не выполнился. Что дальше?

Dantix ★★
()
Ответ на: комментарий от Dantix

Ладно, я хочу разобраться, мне без разницы, что говорит Крокфорд. Насколько я понял, он не всегда четко понимает, что говорит. Я вроде понял суть происходящего, а так, пох.

anonimous
() автор топика
Ответ на: комментарий от anonimous

На самом деле я не нашел упоминания eval рядом Function в Good Parts, так что дальнейщие прения на эту тему вообще не конструктивны без цитаты. Может тебе это вообще приснилось.

Dantix ★★
()
Последнее исправление: Dantix (всего исправлений: 1)
Ответ на: комментарий от anonymous

eval(str) = Function(str)()

eval(str) != Function(str)()

tst1=function(a){console.log(eval(a))}
tst2=function(a){console.log(Function(a)())}

b=1
tst1("b")
tst2("b")

1
undefined

anonimous
() автор топика

Погоди, Крокфорд - это разве не тот, что даже в монадах не смог разобраться? Зачем ты его читаешь?

anonymous
()
Ответ на: комментарий от anonymous

Я до его монад пока не дошел:) А что там у него с монадами не так?

anonimous
() автор топика
Ответ на: комментарий от anonimous

У тебя eval головного мозга, видимо лиспы слишком рано увидел.

anonymous
()
Ответ на: комментарий от Dantix

Ну так какой контекст-то там был?

is another form of eval

Это даже круче, чем я сказал, IS, нам кагбе намекает на это.

anonimous
() автор топика
Ответ на: комментарий от anonimous

И? В предыдущих абзацах идет речь, что eval - это небезопасная, медленная штука, которую следует избегать по этим причинам. В этом говорится, что Function - это другая форма eval (соотвественно страдает теми же проблемами) и по тем же причинам ее стоит избегать. В чем проблема?

Dantix ★★
()
Ответ на: комментарий от Dantix

Тогда все что долго выполняется следует считать эквивалентом эвала. Ладно, это уже порожняки пошли, давай закончим на «волшебном контексте».

anonimous
() автор топика
Ответ на: комментарий от anonimous

Порожняки только прошли, лол. Любой неидиот понимает, что обмен кодом и произвольное его исполнение это дырища в безопасности и признак отсутствия дизайна. Так же как понимает связь загрузчика и эвалуатора. Когда закончится этот поток бреда в девелопменте?

arturpub ★★
()
Ответ на: комментарий от arturpub

А об этом (безопасности, дизайне) кто-нибудь спрашивал? Или это ты тихо сам с собой, из под шконки?

anonimous
() автор топика
Ответ на: комментарий от arturpub

дырища в безопасности

Кстати, постоянно слышу эту мантру, но не могу понять, в чем она заключается, эта дыра (если конечно ты не собираешся исполнять произвольный код из посторонних источников прямо на сервере). При этом, те кто утверждает, почему-то никогда не поясняют. Может ты пояснишь?

anonimous
() автор топика

Ты странно читаешь книги и видимо слабо чувствуешь контекст того, что тебе хочет передать автор. Конечно это не тоже самое, но что бы объяснить человеку с первого раза это объяснение подойдет.

umren ★★★★★
()
Ответ на: комментарий от umren

ИМХО, лучше сразу говорить то что есть. Но, если честно, у меня сложилось впечатление, что, в данном случае, автор слабовато представляет вообще, о чем он говорит, ИМХО. Это как-раз-таки из контекста.

anonimous
() автор топика
Ответ на: комментарий от anonimous

Кстати, постоянно слышу эту мантру, но не могу понять, в чем она заключается, эта дыра (если конечно ты не собираешся исполнять произвольный код из посторонних источников прямо на сервере). При этом, те кто утверждает, почему-то никогда не поясняют. Может ты пояснишь?

слышал что-нибудь про sql-инъекции?

anonymous
()
Ответ на: комментарий от anonymous

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

anonimous
() автор топика
Ответ на: комментарий от anonimous

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

При том же, при чем и в случае sql-инъекций. Код запускается не полученный хрен знает откуда, а твой какой-то, который ты собираешь в собственной программе. При этом ничего странного нету в том, что при сборке этого кода ты воспользуешься какой-то введенной пользователем информации, например, у тебя будет нечто типа eval(«blablabla» + ... + uset_input + ... + «blablabla»), где user_input - какой-то ввод пользователя (логин/пароль/етц.), тогда никто не мешает мне в строке ввода логика eval(«do_anything_i_want») и в случае сервер-сайд джаваскрипта (типа ноды или монгодм, например) мой код будет бодро исполнен на сервере. Можешь погуглить ssji для подробностей.

anonymous
()
Ответ на: комментарий от anonymous

Хз, я обычно принимаю запросы вот так примерно

if(request===somestring)foo()
//если даже так
if(request===somestring)eval(foo)
//эвалиться только то что надо, а не то что захочет отправитель
//имхо, такое возможно только при таком вот раскладе
eval(request)
//либо, как вариант
handler(request)// где handler, что-то вроде такого
function handler(arg){eval(substring(arg))}
//да и то, в последнем варианте только если фильтрация дырявая
Эвалить строки пришедшие, или подстроки даже, это конечно дыра, но это дыра в голове разработчика, а не в эвале.

anonimous
() автор топика
Ответ на: комментарий от anonimous

Хз, я обычно принимаю запросы вот так примерно

В описанных тобой случаях евала нет. А если евала нет - то и дырки в безопасности нет. Очевидно же.

//эвалиться только то что надо, а не то что захочет отправитель

Если евалиться «то, что надо», то такой евал ничего не делает, а значит его и нет, как нет и дырки, да.

anonymous
()
Ответ на: комментарий от anonimous

Эвалить строки пришедшие, или подстроки даже

Никто не евалит строки или подстроки. Речь о евале ф-и от строки/подстроки, результат которой содержит эту строку/подстроку как свою подстроку.

anonymous
()
Ответ на: комментарий от anonimous

eval(«blablabla» + ... + uset_input + ... + «blablabla»)

Что непонятного? Стандартное использование евала. Никакая фильтрация не поможет, т.к. даже user_input состоящее из букв латинского алфавита - уязвимость, позволяющая (потенциально) вывести произвольные данные.

anonymous
()
Ответ на: комментарий от anonymous

Правильно, я говорю, что юзер-инпут напрямую эвалить не надо. Хз, может при больших объемах данных без этого не обойтись, но я лично, в своих игрушках, так не делаю. На этом все проблемы с эвалом заканчиваются.

anonimous
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.