LINUX.ORG.RU

Function. Зачем нужна?

 


1

1

Зачем в JS Function (которая с большой буквы)? Че то информация по этому вопросу крайне скудна. Используется она, насколько я понимаю, редко. Загуглить нормально тоже не могу, гугл не различает регистр буков, падла.

Насколько я понимаю, данная конструкция не создает замыканий. Она всегда, вроде, обращается к глобальному неймспейсу. Больше я про нее ничего не знаю.

Зачем она вообще нужна? Какое ее прямое назначение? Зачем она была засунута в язык? И как ее вообще можно использовать?

Спасибо за ответы.

Ну так это конструктор объекта функции, так и надо было гуглить.

Можно наговнокодить что-нибудь с шаблонами (текстовыми в смысле)

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

Все в JS — объект. Соответственно, функции представляются объектами «класса» (на самом деле не класса, там прототипная модель) Function. При этом «function» — это не конструктор Function, а простой оператор языка.

Могу ошибаться, в JS не слишком силен.

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

Ну,а что это вообще означает с точки зрения семантики? Это чтобы можно было расширить, например, объект функции (любой), по ее прототипу? Вроде этого?


tst=function(){}
Function.__proto__.foo="bar"
console.log(tst.foo)

bar

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

Не пойму, работает точно также

tst=function(){}
tst2=function(){}
tst.__proto__.foo="bar"
console.log(tst2.foo)

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

се в JS — объект. Соответственно, функции представляются объектами «класса» (на самом деле не класса, там прототипная модель) Function. При этом «function» — это не конструктор Function, а простой оператор языка.

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

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

Так ты про использование конструктора, или про прототип?

С точки зрения семантики это по-моему конструктор который ну просто должен быть.

Прототип - он и есть прототип, в нём все методы и свойства функций (как объектов) определены. А трогать прототипы стандартных объектов плохо, __proto__ - тоже плохо.

Не думаю что есть какое-нибудь нормальное применение. Практическое - это только упоротое метапрограммирование на строках да и то тоже плохо потому что почти как эвал да в глобальном контексте.

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

А зачем неявным если он есть? Например можно ещё так использовать:

>>> var f = function() {}
>>> f.constructor === Function
true
>>> var o = {}
>>> o.constructor === Function
false

Не пойму, работает точно также

Ну дк так и должно быть. f.__proto__ и есть Function.__proto__. Почитай где-нибудь про прототипы и все эти .prototype, .constructor.prototype, .__proto__ - довольно мутная тема

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

BTW, интересную фигню обнаружил по ходу:


console.log(Function)
Function=1
console.log(Function)
tst=function(){}
console.log(tst.__proto__)

//output:
//[Function: Function]
//1
//[Function: Empty]

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

Зачем в JS Function (которая с большой буквы)? Че то информация по этому вопросу крайне скудна. Используется она, насколько я понимаю, редко.

Информации более чем дохрена, это конструктор функций. Используется по необходимости.

Загуглить нормально тоже не могу, гугл не различает регистр буков, падла.

https://www.google.ru/#newwindow=1&q=js Function
Первая строчка, прикинь, а теперь расскажи нам как ты гуглишь.)

Насколько я понимаю, данная конструкция не создает замыканий. Она всегда, вроде, обращается к глобальному неймспейсу. Больше я про нее ничего не знаю.

У тебя уже крыша поехала от замыканий.

Зачем она вообще нужна? Какое ее прямое назначение? Зачем она была засунута в язык? И как ее вообще можно использовать?

С подошью нее можно создавать функции, что тут может быть сложного?

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

Так ты про использование конструктора, или про прототип?

Да я вообще, просто пытаюсь разобраться, как устроун язык. Фленагана я запарился читать:)

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

Это чтобы можно было расширить, например, объект функции (любой), по ее прототипу? Вроде этого?

Прототипы это что то вроде наследования, они тут вообще не к месту.

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

теперь расскажи нам как ты гуглишь

Так он че различает штоле? Раньше вроде не различал. Я давно гуглил, честно говоря, тока щас вспомнил.

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

Так он че различает штоле?

Какая разница? Результат выдает тот который нужен.

Я давно гуглил, честно говоря, тока щас вспомнил.

Если ты даже не гуглил на хрена писать «Загуглить нормально тоже не могу» ?

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

У тебя уже крыша поехала от замыканий.

А что я не так сказал?

С подошью нее можно создавать функции, что тут может быть сложного?

Ты имеешь в виду new Function? А нахрен это нужно? Я где-то читал, что это вообще плохой стиль.

Да, кстати, а мож она для этого и была включена в язык, ради оператора new? Мля, точно же, как Object, String и прочее. Это, мля, пародия на класс-ооп, клоунада, короче, Все, я понял.

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

А что я не так сказал?

Тема замыканий в данном случае неважна.

Ты имеешь в виду new Function?

new Function и Function одно и тоже.

А нахрен это нужно?

Создавать функции.

Я где-то читал, что это вообще плохой стиль.

Может быть и что?

Да, кстати, а мож она для этого и была включена в язык, ради оператора new? Мля, точно же, как Object, String и прочее. Это, мля, пародия на класс-ооп, клоунада, короче, Все, я понял.

Нет она была сделана чтобы создавать функции 4 раза сказал уже.

TDrive ★★★★★
()

1) Чтобы накостылять в Function.prototipe.bind по мотивам Ъ bind для древних версий JS

2) Function — это такой eval с глобальным scope. Если eval тебе не нужен, то Function — тем более.

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

Нет она была сделана чтобы создавать функции 4 раза сказал уже.

Да ф-ции ты и так можешь создавать.

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

1) Чтобы накостылять в Function.prototipe.bind по мотивам Ъ bind для древних версий JS

А Вы не знаете, случайно, где об этом можно почитать?

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

© JavaScript: the definite guide

if (!Function.prototype.bind) {
Function.prototype.bind = function(o /*, args */) {
// Save the this and arguments values into variables so we can
// use them in the nested function below.
var self = this, boundArgs = arguments;
// The return value of the bind() method is a function
return function() {
// Build up an argument list, starting with any args passed
// to bind after the first one, and follow those with all args
// passed to this function.
var args = [], i;
for(i = 1; i < boundArgs.length; i++) args.push(boundArgs[i]);
for(i = 0; i < arguments.length; i++) args.push(arguments[i]);
}
// Now invoke self as a method of o, with those arguments
return self.apply(o, args);
};
};
x3al ★★★★★
()
Ответ на: комментарий от anonimous
var test1 = new Function("x", "this.x2=x; return this.x2 * this.x2");
alert(test1(2)+' '+window.x2);

var test2 = Function("y", "this.y2=y; return this.y2 * this.y2");
alert(test2(3)+' '+window.y2);

Ты про это?

TDrive ★★★★★
()
Последнее исправление: TDrive (всего исправлений: 2)
Ответ на: комментарий от anonimous

Да мало того, оказывается оно не всегда срет в глобальную область то.

ob={}
ob.a=Function("this.x=1")
console.log(ob)// --> { a: [Function] }
ob.a()
console.log(ob) // --> { a: [Function], x: 1 }
console.log(global.x) // --> undefined

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

Используется когда надо создать тело функции динамически. Типа eval. На практике обычно юзается для компиляции шаблонов страниц (я о сервере, на клиент грузят сразу компилированные).

Как и eval, без очень веских причин юзать не рекомендуется. В CSP можно закрутить гайки и запретить и то и другое.

В общем, так как своих шаблонизаторов вы скорее всего делать не будете, Function вам не надо.

Vit ★★★★★
()

Наш герой снизошел до какого-то конкретного языка. А как же теория категорий, пандорические захваты, анафорические лямбды и мамкин борщ? Неужели он теперь всего лишь хеллоуворлдовщик на JS?

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

В общем, так как своих шаблонизаторов вы скорее всего делать не будете, Function вам не надо.

Надо-не надо, это для меня вопрос третий, я пытаюсь разобраться, как работает язык, поэтому, все надо.

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

в этом диалекте схемы такие «особенности»

У меня, пока, складывается такое ощущение, что схема - это только подмножество JS. Он почти полностью повторяет семантику схемы, за исклюсением call/cc, в функциональной своей части, но все, что касается его объектной системы - это не scheme, и это не ооп на замыканиях.

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

Я селф, не знаю, вообще, чисто читал, что да, в JS объекты из селф. Но я по мере втыкания в js, почему-то, нахожу много общего в поведениии его ООП, с лиспом с динамическим биндингом.

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

Вот банальный пример


ob=function(arg){var a=1; return eval(arg)};
console.log(ob("a"))//-->1

ob={ a: 1}
console.log(ob["a"])//-->1

Семантическкое сходство явно присутствует.

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

А вот newlisp:

(define ob (lambda(arg) (let (a 1) (eval arg))))
(print (ob 'a)); --> 1

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

белое это чёрное

Насколько я понимаю, оператор new, это такой вот сахарок:


//незасахаренный вариант:
mkob=function(){return {a: 1}}
ob1=mkob()
ob2=mkob()
console.log(ob1, ob2)//--> { a: 1 } { a: 1 }
console.log(global.a)//--> undefined

//с сахаром new (class-oop style):
mkob=function(){this.a=1}
ob1=new mkob()
ob2=new mkob()
console.log(ob1, ob2)//--> { a: 1 } { a: 1 }
console.log(global.a)//--> undefined


//в следующем примере this срет в global
mkob=function(){this.a=1}
ob1=mkob()
ob2=mkob()
console.log(ob1, ob2)//--> undefined undefined
console.log(global.a)//--> 1


Но с Function, этого, вроде, действительно не происходит. Это конечно, не одно и то же, но я пока не нашел разницы в поведении Function с new и без него.

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

Загуглить нормально тоже не могу

'кавычки' юзай.

по теме — не помню. Вроде это конструктор.

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

Ты хочешь сказать, что гугл в кавычках различает регистр? По-моему, ни хрена. По запросу https://www.google.ru/search?q="fuck" и https://www.google.ru/search?q="Fuck" на 6 позиции маленткая букова. Разницы в выдаче почти нет.

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

Ты хочешь сказать, что гугл в кавычках различает регистр?

раньше различал. Как и яндекс. Но ты учти, что

1. Предложения записываются с большой буквы, потому по любому будет много лишнего.

2. Это относится не только к самому поиску, но и к гуглоботам и к индексации. И эти три алгоритма постоянно меняются. Если гуглобот не видит разницы в регистре, то в «результате» оно будет по любому смешано. Также и с индексацией.

3. и наконец, попробуй Яндекс, там результатов конечно поменьше, но алгоритм другой, и часто лучше подходит (и там ещё и мануал есть к расширенному поиску)

В гугломануале мы имеем следующее:

Совет 3. Не беспокойтесь о мелочах

Орфография. Google автоматически выполнит поиск по наиболее часто встречающемуся варианту написания указанного вами слова, даже если оно введено с ошибкой. Попробуйте сами: gooogle.
Заглавные буквы. Регистр ключевых слов не имеет значения. Например, запросы наука и жизнь и Наука и жизнь дают одинаковые результаты.

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

Я не особо силён в теориях, могу только практикой поделиться. Имейте в виду, что сейчас есть тенденция для безопасности закручивать на клиенте гайки через CSP. Если закрутить до упора, то отвалятся eval + Function + динамические <script>.

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

и часто лучше подходит

например?

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

там результатов конечно поменьше

Основная проблема даже не в этом, а в том, что Я сливает по многословным, длинным запросам. А они, как правило, и нужны. Сиськи фриске он покажет не хуже, это да.

Плюс, он толком не умеет индексировать скрипты, так что он вообще пол-ынета не видит.

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