Изо всех сил пытаясь понять, как определяются значения определенных параметров функции - PullRequest
0 голосов
/ 20 марта 2019

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

function gotItAll(res) {

$('#actionscreen').modal('hide')

if (res.ErrorHtml != "" && res.ErrorHtml.substring(0,31) != "Error copying to sub data table") {

    document.getElementById('GridView').innerHTML = res.ErrorHtml;
    InfoMessage("Error", res.ErrorHtml);
} else {

    if (res.BrowseTreeBreadCrumbs != null) {
        //generateBrowseTreeHtml(res);
        sessionStorage.setItem("browseTreeBC", res.BrowseTreeBreadCrumbs);
        if (res.BrowseTreeBreadCrumbs.indexOf("-1") > 0 || res.BrowseTreeBreadCrumbs.indexOf("- -1") > 0 || res.BrowseTreeBreadCrumbs.indexOf("- -999") > 0 || res.BrowseTreeBreadCrumbs.indexOf("-999") > 0 || res.BrowseTreeBreadCrumbs.indexOf("-999") > 0 || res.BrowseTreeBreadCrumbs.indexOf("</b>  </span") > 0) {
            $('#breadCrumbsID').hide();
        }
    }

    BaseTable = res.TableName; 
    recs = res.records;

'res' - это параметр, который, насколько я могу судить, нигде не определен в программе, но он возвращает значение.Я не смог определить, где вызывается gotItAll () и передается значение, отличное от res.Кроме того, у нас есть res.ErrorHtml, res.BrowseTreeBreadCrumbs.indexOf, res.TableName и т. Д., Которые, кажется, нигде не определены, но все они возвращают разные значения.

Все учебники, которые я смотрю / читаю по параметрам, имеют смысл, но часто, когда я читаю фрагменты кода, они больше не имеют смысла для меня, так как контекст отличается от учебников.

РЕДАКТИРОВАТЬ: обратите внимание, что gotItAll () никогда не вызывается в коде, вместо этого он сам передается в качестве параметра, подобного этому, поэтому возникает путаница.Насколько я могу судить, заполнитель res никогда не заменяется значением:

InventoryEditor.ItemEdit.AddNew(itemTypeUid, itemTypeName, gotItAll, failedCallBack);

Ответы [ 2 ]

0 голосов
/ 20 марта 2019

Отправленный вами фрагмент кода - это просто функция declaration. По сути, этот сниппер определяет существование функции с именем gotItAll, которая принимает один параметр в качестве входных данных. Параметр называется res, поэтому внутри функции, слово res относится к параметру функции.

Давайте использовать простую функцию в качестве примера:

function double(x) {
  return x * 2
}

Эта функция также является параметром и называется x. Внутри функции вы называете ее x.

Когда вы хотите use функцию, вы вызываете функцию и задаете параметр, такой как:

double(2) // returns 4
double(4) // returns 8
double(7) // returns 14

Как видите, мы можем передать функции double разные значения. Когда вы вызываете double(4), в основном функция учитывает x = 4, и поэтому каждый раз, когда в объявлении функции вы используете x, вместо этого вы будете использовать значение 4.

Вы также можете передавать различные переменные в функцию:

var y = 10
double(y) // returns 20

Так же, как и раньше, вы присваиваете функции переменную y, значение которой равно 10. Так что в основном программа выполняет x = y, и каждый раз, когда она ссылается на x внутри объявления функции, она будет использовать значение y.

Вернемся к вашему примеру. Я не знаю, что делает эта функция, но в основном res является именем-заполнителем параметра, который будет передан функции. Эта функция может вызываться из всего кода как gotItAll(variableName), и функция будет выполняться с учетом res = variableName. В вставленном вами сниппере функция только объявлена, но нет примеров фактического использования функции, поэтому вы не видите, откуда взято res.

РЕДАКТИРОВАТЬ: после вашего комментария я понял, что вы на самом деле имеете в виду. На самом деле, в Javascript вы можете передавать функции в качестве параметра другой функции. Возьмем, к примеру, функцию double, объявленную выше. Теперь я хочу создать функцию, которая удваивает число, только если они четные. Я могу заявить это:

function doubleEven(x, doublingFunction) {
  if (x % 2 === 0) {
    return doublingFunction(x)
  } else {
    return x
  }
}

и я могу использовать его как:

doubleEven(2, double) // returns 4
doubleEven(5, double) // returns 5

Обычно я передаю double в качестве параметра функции doubleEven. Таким образом, в объявлении doubleEven значение doublingFunction становится равным double, поэтому оно является функцией.

Конечно, в этом примере это глупо, нет необходимости передавать функцию для удвоения числа. Однако это часто используется в javascript для обеспечения обратного вызова асинхронной задачи, такой как сетевой запрос.

0 голосов
/ 20 марта 2019

res передается из любых вызовов gotItAll

Res.whither являются атрибутами объекта res

Имя res только для использования в этой функции и, вероятно, будет иметьотличается от того, что использовалось в качестве параметра.

Пример

funciton addOneToNumber(numberToAddTo)
{
   return numberToAddTo += 1;
}

function mainFunction()
{
   var newNumber = addOneToNumber(1)
}

Редактировать:

Вы можете использовать любой объект в JavaScript, который будет использоваться в качестве параметра.В этом случае функция была использована.Похоже, что failedCallback также является функцией.Который будет вызываться в случае сбоя вызова на сервер

Внутри InventoryEditor.ItemEdit.AddNew где-то, gotItAll вызывается с res, что было бы результатом вызова сервера от любого типа вызова

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...