Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Array.prototype.slice.call можно вызывать и без 0:Array.prototype.slice.call(arguments);function (foo, bar) {
if (typeof foo === 'undefined') foo = 30;
if (typeof bar === 'undefined') bar = 'test';
console.log(foo, bar);
}
function (foo, bar) {
foo = foo || 30;
bar = bar || 'test';
console.log(foo, bar);
}
К сожалению, из-за бага в трёх популярных браузерах(IE, Fx, Opera) я не смог добиться желаемого эффекта
function test(a, b) {
arguments[0] = 100;
arguments[1] = 101;
console.log(a,b);
}
test(1,2); // => 100, 101
test(1); // => 100, undefined
(...) named data properties of an arguments object whose numeric name values are less than the number of formal parameters of the corresponding function object initially share their values with the corresponding argument bindings in the function’s execution context. This means that changing the property changes the corresponding value of the argument binding and vice-versa. (...)
new Function('a', 'b', 'return a+b');
Если более чем один параметр передаётся конструктору Function, все параметры кроме последнего преобразовываются в строки и конкатенируются вместе с использованием запятых в качестве разделителя. Результирующая строка интерпретируется как СписокФормальныхАргументов для ТелаФункции, определённого последним параметром.
Для каждого неотрицательного числа arg, меньшего значения свойства length создаётся свойство с именем ToString(arg) и атрибутом { DontEnum }. Начальным значением этого свойства является реальное значение соответствующего аргумента, переданное при вызове. Первое реальное значение аргумента соответствует arg = 0, второе — arg = 1 и так далее. В том случае, когда arg меньше количества формальных параметров объекта Function, значение свойства является общим с соответствующим свойством объекта активации. Это означает, что изменение данного свойства изменяет соответствующее значение свойства у объекта активации и наоборот.
for (arg = 0; arg < func.length; arg++) {
link(arguments[i], formalParameters[i]);
}
Note: The SpiderMonkey JavaScript engine has a bug in which arguments[n] cannot be set if n is greater than the number of formal or actual parameters. This has been fixed in the engine for JavaScript 1.6.
Для каждого неотрицательного числа arg, меньшего значения свойства length создаётся свойство с именем (...)
Создаётся свойство с именем length и атрибутами { DontEnum }. Начальным значением этого свойства является число реальных значений аргументов, переданное при вызове.
arguments в ES5/non-strict ES5 JS кодом: gist.github.com/539974arguments.arguments больше не создается (т.е. обычные статические копии формальных параметров).arguments вообще будет удален и заменен на rest — полноценный массив.var myFunc = function(foor, bar){ console.log(arguments); }.types(Foo, Bar).cast(Foo, Bar).allRequired();
allRequired как сделать, тем более ему передастся функция, которая требует 0 аргументов?)Function.prototype.allRequired = function(){
var f = this, validLength = f.length;
return function(){
if (arguments.length >= validLength)
return f.call(this, arguments);
else
throw new Error('oh Shit..');
}
};
(function () {
// code
}.cast(Number).allRequired());
Function.prototype.cast = function (types) {
var fn = this;
return function () { // cast inner function
// casting arguments
return fn.call(this, arguments);
};
};
Function.prototype.allRequired = function () {
var fn = this; // оно ссылается не на нужную функцию, а на cast inner function
return function () {
}
};
Function.prototype.cast = function (types) {
var fn = this;
var result = function () { // cast inner function
// casting arguments
return fn.call(this, arguments);
};
result.length = fn.length;
return result;
};
result._length = fn._length || fn.length;function test(options)
{
if(options.foo===default)options.foo=30;
if(options.bar===default)options.bar='test';
console.log(options.foo,options.bar);
}/**
* Pewpew
*
* @param {Object} [foo]
* @param {Mixed} [foo.smth]
* @param {Boolean} [bar=true]
* @param {String} [baz='pewpew']
* @param {Boolean} [bar=false]
*
* @returns {Mixed}
*/
function pewpew(foo, bar, baz, qqq) {
foo = foo || {}; // default empty object
bar = bar || bar == null; // default true (можно не использовать typeof bar)
baz = baz || 'pewpew'; // default some string
qqq = qqq || false; // default false
if (foo.smth) {
do();
}
}
"strict mode"baz передать пустую строку?/**
* Pewpew
*
* @param {Object} [foo]
* @param {Mixed} [foo.smth]
* @param {Boolean} [bar=true]
* @param {String} [baz='pewpew']
* @param {Boolean} [bar=false]
*
* @returns {Mixed}
*/
function pewpew(foo, bar, baz, qqq) {
foo = foo != null ? foo : {}; // default empty object
bar = bar != null ? bar : true; // default true
baz = baz != null ? baz : 'pewpew'; // default some string
qqq = qqq != null ? qqq : false; // default false
if (foo.smth) {
do();
}
}
/**
* Pewpew
*
* @param {Object} [foo]
* @param {Mixed} [foo.smth]
* @param {Boolean} [bar=true]
* @param {String} [baz='pewpew']
* @param {Boolean} [bar=false]
*
* @returns {Mixed}
*/
function pewpew(foo, bar, baz, qqq) {
Args(arguments).defaults({}, true, 'pewpew', false)
if (foo.smth) {
do();
}
}
Магия JavaScript: arguments