Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #21 (permalink)  
Старый 02.05.2011, 19:38
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от B@rmaley.e><e Посмотреть сообщение

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


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 нельзя использовать оверлоадинг ( перегрузки )

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

melky, и что это? Во-первых, где тут значения по-умолчанию, а во-вторых, что помешает Вам написать какой-нибудь код, оперирующий с arr, до проверки?
Ответить с цитированием
  #23 (permalink)  
Старый 02.05.2011, 20:01
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

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

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


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

Это и есть стандартный подход.
Ответить с цитированием
  #25 (permalink)  
Старый 02.05.2011, 21:18
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Сообщение от 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 нельзя использовать оверлоадинг ( перегрузки )

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

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

Сообщение от 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
а что помешает сделать ошибку или опечатку в другом месте? Например, вызвать функцию с другими значениями по умолчанию или забыть воспользоваться оберткой
Функцию Вы объявляете один раз, а ее тело может правиться много и долго. Как забыть обертку - не понял.
Ответить с цитированием
  #27 (permalink)  
Старый 02.05.2011, 21:36
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от x-yuri Посмотреть сообщение
можешь привести конкретный пример, где по-твоему нужна перегрузка?
если придумать код, а потом попробовать перевести его на 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);
}
Ответить с цитированием
  #28 (permalink)  
Старый 02.05.2011, 22:42
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

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

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

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

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Узнать имя функции Bercut Общие вопросы Javascript 27 25.12.2020 08:02
Как можно что-нибудь узнать про интерфейс чужого объекта GRIG Internet Explorer 0 09.03.2011 17:16
Можно ли узнать нажатие кнопки "назад" в браузере ? phenom jQuery 0 03.02.2011 18:07
Как можно узнать что value в INPUT изменилось? moskrc jQuery 2 22.10.2010 09:06
Можно ли узнать назначенные события MainBuh Events/DOM/Window 4 17.08.2010 11:22