Показать сообщение отдельно
  #14 (permalink)  
Старый 01.05.2011, 11:15
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

Сообщение от melky
и в веб-приложениях, в которых даже деление на 1000 заменяют на умножение на 0.001,потому что так на 50 микросекунд быстрее ( в играх, например )..
Глупая оптимизация. Можно подумать, в наш век едва ли не повсеместного распространения JIT компиляции, интерпретатор не додумается заменить деление на умножение.
Сообщение от melky
можно еще поговорить,как лучше в функцию передавать аргументы
Вот статейка по теме.
Сообщение от poorking
а почему вот так нельзя
Для начала, пожалуй, потому, что так не работает. В Опере, например, непереданные аргументы не появятся сами собой после изменений значений в arguments.
(function(a, b, c, d){
  alert([a,b,c,d] + '\n' + arguments.length);
  arguments[0] = 10;  arguments[1] = 13;
  arguments[2] = 11;  arguments[3] = 12;
  arguments.length = 4;
  alert([a,b,c,d] + '\n' + arguments.length);
})(5, 4)
Смотреть в опере.

Да и устанвливать значения по-умолчанию внутри самой функции как-то не круто, на мой взгляд. Перед установкой значений по-умолчанию можно написать еще кучу кода и не заметить этого. Мне больше нравится такой подход (в качестве бонуса можно еще и контекст указать)
function lambda(fnc, context, defaults){ // другого имени не придумал
	var defaultArgs = [], key, names;
	if(defaults){
		names = fnc.toString().match(/^[\s\(]*function[^(]*\(([^)]*)\)/)[1]
		                      .replace(/\/\/.*?[\r\n]|\/\*(?:.|[\r\n])*?\*\//g, '')
		                      .replace(/\s+/g, '').split(',');
		names = names.length == 1 && !names[0] ? [] : names;

		for(var i = 0, length = names.length; i < length; ++i){
			key = names[i];
			defaultArgs.push(defaults[key]);
		}
	}

	return function(){
			return fnc.apply(context, lambda.merge(arguments, defaultArgs));
		}
}
lambda.merge = function(arr1, arr2){
	var length = Math.max(arr1.length, arr2.length),
		arr = [];
	for(var i = 0; i < length; ++i){
		arr.push(i < arr1.length ? arr1[i] : arr2[i]);
	}
	return arr;
};


alert(lambda(function(a, b){alert(this); return a + b}, 'Hello, world!', {a: 50, b: 77, c: 42})(10));
Ответить с цитированием