Сообщение от 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));