Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как сделать именованую функцию, запускающуюся при объявлении? (https://javascript.ru/forum/misc/33760-kak-sdelat-imenovanuyu-funkciyu-zapuskayushhuyusya-pri-obyavlenii.html)

Shitbox2 07.12.2012 08:27

Как сделать именованую функцию, запускающуюся при объявлении?
 
Т.е. можно ли
var func = function() {...}
var func()

заменить одной строчкой?

Aetae 07.12.2012 08:58

С var и без дублирования - нет.
А так:
(func = function() {alert(new Date())})()
func()

Skipp 07.12.2012 09:55

Одной строкой, да легко:)
var func = function(){ ... }; func();

Shitbox2 07.12.2012 10:02

Точняк! Имя тоже надо было брать в скобки! Второй вариант с подвохом)

Кстати (var func = function() {alert(new Date())})() не работает. Приходится создавать глобальную переменную

Aetae 07.12.2012 23:41

Кстати есть ещё один дюже хитрый вариант(если функция не должна ничего возвращать):
var func = function() {alert(new Date()); return arguments.callee}()
func()

tenshi 08.12.2012 23:03

var autorun= function( func ){
    func.call.apply( func, arguments )
    return func
}

var func= autorun( function(){
    alert( 1 )
} )

func()

tenshi 08.12.2012 23:10

var func= (new function( ){
    alert( 1 )
}).constructor

func()

tenshi 09.12.2012 01:33

расслабься, мы не на экзамене

Magneto 09.12.2012 04:08

Из всех предложенных вариантов я не увидел ни одной именованной функции. Ведь именованные функции объявляются вот так:
function named () {};


Есть 2 вида функций, именованные и анонимные. Именованная функция видна везде (везде в области видимости), а анонимная - только после объявления. Почитать в учебнике.

Есть еще одно отличие в этих функциях, и кажется это отличие как раз и послужило названием для этих типов функций (именованные и анонимные).
//    Объявляем именованную функцию с именем named и интерпретатор сам
//    положит ее в переменную named 
function named () {
};


//    Объявляем неименованную функцию и ложим ее в переменную  noNamed 
var noNamed = function () {
};


//    Объявляем именованную функцию с именем ohoho и ложим ее в переменную wtf
var wtf = function ohoho () {
};

alert(named.name);
alert(noNamed.name);
alert(wtf.name);


Теперь к вопросу:
Цитата:

Сообщение от Shitbox2
Как сделать именованую функцию, запускающуюся при объявлении?

Например вот так:
(function named () {
    //    Ваш код
}());


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

Ну и если все же нужно сохранить ссылку на эту функцию то Aetae выше уже писал примеры.

melky 09.12.2012 10:51

Цитата:

Сообщение от iMaxmaxmaximus
Есть 2 вида функций, декларированные и выраженные.

и забинденные. они - самые магические в JavaScript штуки.

melky 09.12.2012 10:57

Цитата:

Сообщение от iMaxmaxmaximus (Сообщение 220375)
я что то не слышал про такие О_О
или ты пошутил?

нет, не пошутил. забинденные функции возвращаются после Function.prototype.bind

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

kobezzza 09.12.2012 11:02

Цитата:

Сообщение от melky (Сообщение 220377)
нет, не пошутил. забинденные функции возвращаются после Function.prototype.bind

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

Я проверял вызов забинденых функций в цикле, тормознее раз в 5 :)

melky 09.12.2012 11:08

Цитата:

Сообщение от kobezzza
Я проверял вызов забинденых функций в цикле, тормознее раз в 5

парадокс :) интересно, почему так

tenshi 09.12.2012 13:01

и пошли все выпендриваться кто лучше знает яваскрипт, развернулась дискуссия о тонкостях именования функций, начали сравнивать скорости разных объявлений)

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

melky 09.12.2012 13:52

Цитата:

Сообщение от iMaxmaxmaximus (Сообщение 220382)
Ну так раз они выражаются выражением вызова метода bind, значит они выраженные. Кэп.

И, для справки
Function.prototype.bind = function(context){
    var self = this;
    return function(){ self.apply(context, arguments) }
}

что за коленочное поделие?
Цитата:

ПРИМЕЧАНИЕ У объектов Function, созданных посредством Function.prototype.bind, отсутствует свойство prototype или внутренние свойства [[code]], [[FormalParameters]] и [[Scope]].
я про это говорил. по логике они должны быть быстрее, т.к. у них много всего обрезается.

но на практике
http://jsperf.com/another-bind-performance-check

Цитата:

Сообщение от tenshi (Сообщение 220390)
и пошли все выпендриваться кто лучше знает яваскрипт, развернулась дискуссия о тонкостях именования функций, начали сравнивать скорости разных объявлений)

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

так то уже пошёл оффтоп. чего трёп критиковать?

tenshi 09.12.2012 14:08

а при чём тут рефакторинг?

tenshi 09.12.2012 14:18

ртфм http://ru.wikipedia.org/wiki/%D0%A0%...B8%D0%BD%D0%B3

melky 09.12.2012 15:01

Цитата:

Сообщение от iMaxmaxmaximus (Сообщение 220401)
в смысле? коленочное поделие как коленочное поделие, че тупим то.

ото ж. дальше мой пост не читал?

melky 09.12.2012 15:45

Цитата:

Сообщение от iMaxmaxmaximus
Понятно зачем нужно было коленочное поделие?

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


Часовой пояс GMT +3, время: 10:11.