каменное объявление функции
вопрос вот в чем. есть функция, скажем, в которой есть ветвление, которое трудно высчитывается, но делается один раз.
так вот, есть два выхода (три даже), но не знаю,что выбрать... чистоту кода, скорость, или компактность? разницы в скорости,как объявлять функцию, нет!
function abc(){
if( fuckin_counting ){
fucker_counter.*!*make*/!*Count( );
} else {
fucker_counter.*!*do*/!*Count( );
}
}
да,да. видите названия методов? различие в первой половине. И еще, доступа к этим функциям я не имею (ну, браузеровские) можно еще так
abc = fuckin_counting ?
function(){
fucker_counter.makeCount();
} :
function(){
fucker_counter.doCount();
}
да, я знаю, что возможно было и опустить анонимные обёртки. я пишу то, что у меня в редакторе, изменяя названия. так вот, и еще третий способ. его я боюсь пробовать, потому что наслышан о производительности такого способа объявления. abc = new Function ( "fucker_counter."+(fuckin_counting?"make":"do")+"Count()" ) но это фигня, потому что не видно локальных переменных. тогда что, заюзать eval ? eval( "abc = fucker_counter."+(fuckin_counting?"make":"do")+"Count()" ) кода там чуть больше, чем тут. там есть один аргумент у makeCount (или doCount), который пздц как написан в одну строчку. (свёрнут,короче говоря). так что думаете ? не знаю, что выбрать. щас посравниваю скорости о yeah. я люблю этот сайт )) вот тест как раз для меня результаты вхроме примерно одинаковые (меньше 1% разница) и в ФФ то же самое. так что, для будущих поколений, разницы в скорости,как объявлять функцию, нет! |
Первый вариант функции самый наглядный, плюс определение функции поднимается. Eval - зло, это все знают. Лучше создать одну "ленивую" функцию для таких целей:
function someFunc(choice) {
if (choice) {
//something something
} else {
// something something
}
someFunc = function() {
// новое тело фунции
};
}
Недостаток: свойства и методы созданные до первого вызова функции не сохранятся. |
abc=fucker_counter[fuckin_counting?'makeCount':'doCount']; |
Цитата:
я упомянул, что это функция не моя, а браузера. не увидел,наверное. будет Illegal Invocation.. странно,но нету. но тут еще и сохраняется буль в коде ф-и., если через console.dir смотреть Цитата:
|
"Ленивая" функция используется для задержки определения функции до ее первого вызова, если с функцией связан процесс инициализации который выолняется только один раз. Ну например если тебе нужно определить какие браузер поддерживает возможности и связать с этим функцию. Нет нужды каждый раз исполнять код определения возможностей, ведь браузер пользователя не поменяется магическим образом:
function some_func() {
var result = (feature_detect) ? true : false;
some_func = function() {
if (result) {
}
};
some_func();
}
|
не пойму. это ведь так происходит ? :
это как??? я про последнее. функция ведь заменила саму себя, где нет этой переменной! я не могу это быстро понять, как и замыкания :) в гугле кстати не нашел про это. не посоветуете ничего? |
Можешь поискать "Отложенное определение функции" или "Самоопределяемая функция".
Флэнагана читал? Мне хватило его объяснений не тему замыканий. Могу попытаться объяснить.
function some_func() {
var result = (feature_detect) ? true : false;
/*
* Так как область видимости у функций в javascript лексическая,
* то данная анонимная функция сохраняет
* цепочку областей видимости в которой она определена.
* То есть при вызове кода данной функции, неважно как она сохранена и
* под каким именем, она будет иметь доступ к переменным из объемлющей функции.
* Вот и замыкание. Имя функции значения не
* имеет, важно то, что во внешний код передается ссылка на вложенную анонимную функцию,
* и т. к. функция определена внутри
* другой функции, она будет иметь доступ ко всем переменным объемлющей функции.
*/
some_func = function() {
if (result) {
}
};
some_func();
}
|
хм, конечно читал. на хабре было попроще написано про это (по крайней мере,для меня)
просто, кажется, что, когда функция заменяется чем-либо, то область видимости пропадает. это логика так говорит :) но в замыкании анонимная функция может отработать своё и испариться, а область видимости останется, конечно же. значит,можно делать и так,если я усвоил ....
function a( ){
var num='closure in func1';
alert('fresh func 1');
func=function(){
alert("num="+num+"\n\n function a : \n\n"+a)
}
}
a(); // первый вызов
/* изменяем, но так, чтобы исполнение
было последовательным.
я про то, что тут было бы,
если бы написал внизу
function a(){alert('another func')}
*/
a=function (){ alert('another func') }
a();
func();
у меня просто нет слов! функция исполняется, делает свои дела, потом оставляет в window "телефон", на который можно позвонить (это func, там находится замыкание потом). потом функция a заменяется чем-то другим, что делает совершенно другое и имеет исходный код без всяких присваиваний! красота! это магия!! .. не могу уже тебе плюсовать :) |
Да, Javascript - чистая магия. :)
|
Цитата:
function foo() {
var bar = function() {
alert(true);
};
}
foo();
bar(); //?
function foo() {
return function() {
alert(true);
};
}
foo()();
|
| Часовой пояс GMT +3, время: 03:26. |