Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Можно ли узнать имена входящих аргументов функции? (https://javascript.ru/forum/misc/16838-mozhno-li-uznat-imena-vkhodyashhikh-argumentov-funkcii.html)

melky 02.05.2011 19:38

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 103018)

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

а если делать так?


function arr_cycle ( arr, func ) {

// явл. ли массивом
if ( arr.constructor !== Array ) throw new Error( "'arr' must be Array" );

for ( var i = 0; i < arr.length; i++ )
           i in arr &&  func.apply(window, [ arr[i], i, arr ] );
 
}


правда, очень жаль, что изза такой типизации в JS нельзя использовать оверлоадинг ( перегрузки )

приходится внутри всей функции проверять тип аргумента и только потом расфасовывать методы

B@rmaley.e><e 02.05.2011 19:57

melky, и что это? Во-первых, где тут значения по-умолчанию, а во-вторых, что помешает Вам написать какой-нибудь код, оперирующий с arr, до проверки?

melky 02.05.2011 20:01

вот значения по-умолчанию. про это забыл

...
if ( arr = arr || [] ).constructor  ...


но если ведь необходимо оперировать только с массивами, то как еще ?

B@rmaley.e><e 02.05.2011 20:40

Это и есть стандартный подход.

x-yuri 02.05.2011 21:18

Цитата:

Сообщение от B@rmaley.e><e
Этого я и добивался. Что в C, что в php значения по-умолчанию задаются вне тела функции.

нет, я говорил "вне функции". С таким подходом надо создать обертку для каждой функции и использовать функцию только через нее (чтобы не дублировать значения по умолчанию):
function f(a, b){alert(this); return a + b}

function fWrapper(){
    return lambda(f, 'Hello, world!', {a: 50, b: 77, c: 42});
}

к тому же lambda навязывает задание контекста, т.е. контекст для методов надо либо жестко прописывать в обертке (но тогда нельзя будет вызвать метод в другом контексте), либо указывать при каждом вызове

Цитата:

Сообщение от B@rmaley.e><e
Целью было обеспечение гарантированной установки значения по-умолчанию, т.е. так, чтобы уже на входе в функцию мы имели дело либо с настоящими значениями, либо стандартными.

ну вот я и говорю, что вы пытаетесь изменить язык. Такие вещи вызывают много проблем, и для этого нужны веские причины. А для надежности нужно тестировать код

Цитата:

Сообщение от B@rmaley.e><e
а во-вторых, что помешает Вам написать какой-нибудь код, оперирующий с arr, до проверки?

а что помешает сделать ошибку или опечатку в другом месте? Например, вызвать функцию с другими значениями по умолчанию или забыть воспользоваться оберткой

Цитата:

Сообщение от melky
правда, очень жаль, что изза такой типизации в JS нельзя использовать оверлоадинг ( перегрузки )

приходится внутри всей функции проверять тип аргумента и только потом расфасовывать методы

во-первых не жалко, во-вторых, можешь привести конкретный пример, где по-твоему нужна перегрузка?

B@rmaley.e><e 02.05.2011 21:32

Цитата:

Сообщение от x-yuri
к тому же lambda навязывает задание контекста, т.е. контекст для методов надо либо жестко прописывать в обертке (но тогда нельзя будет вызвать метод в другом контексте), либо указывать при каждом вызове

Это особенность текущей реализации, которая не имеет отношения к аргументам по-умолчанию.
Цитата:

Сообщение от x-yuri
нет, я говорил "вне функции". С таким подходом надо создать обертку для каждой функции и использовать функцию только через нее (чтобы не дублировать значения по умолчанию):
function f(a, b){alert(this); return a + b}

function fWrapper(){
    return lambda(f, 'Hello, world!', {a: 50, b: 77, c: 42});
}

К чему этот код? Вы собираетесь использовать одну функцию с разными аргументами по-умолчанию? Функция сразу должна быть создана через lambda.
Цитата:

Сообщение от x-yuri
а что помешает сделать ошибку или опечатку в другом месте? Например, вызвать функцию с другими значениями по умолчанию или забыть воспользоваться оберткой

Функцию Вы объявляете один раз, а ее тело может правиться много и долго. Как забыть обертку - не понял.

melky 02.05.2011 21:36

Цитата:

Сообщение от x-yuri (Сообщение 103079)
можешь привести конкретный пример, где по-твоему нужна перегрузка?

если придумать код, а потом попробовать перевести его на JS, то решить можно все. и правда.

но передавать объекты ,как один аргумент, будет удобнее

Код:


function doetc( string a, int b, float c, element d ) {
  /* code */
}

function doetc( object options ) {
  doetc( options.a, options.b, options.c, options.d );
}

//example
function hide( element a, int b ){
  doetc (  "hide", b, 0.0, a);
}


x-yuri 02.05.2011 22:42

Цитата:

Сообщение от B@rmaley.e><e
Это особенность текущей реализации, которая не имеет отношения к аргументам по-умолчанию.

ну извини, я как-то расчитывал, что ты приводишь готовый к использованию код. А решить да, можно, надо чтобы lambda сохраняла контекст. И, кстати, это лишняя функциональность в lambda. Это следует хотя бы из ее описания: она назначает значения по умолчанию и задает контекст. У нее слишком много обязанностей. И это плохо.

Цитата:

Сообщение от B@rmaley.e><e
К чему этот код? Вы собираетесь использовать одну функцию с разными аргументами по-умолчанию? Функция сразу должна быть создана через lambda.

я исходил из того, как ты использовал эту функцию и не подумал, что с помощью нее подразумевается создавать функции, а не выполнять

B@rmaley.e><e, давай лучше на ты ;)

melky, у тебя абстрактный пример, а я просил конкретный


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