Использование функции (функция (параметр) { - PullRequest
0 голосов
/ 24 мая 2018

У меня есть пара вопросов по поводу приведенного ниже кода:

  • Что это за функция, которая имеет скобки с левой стороны, но не имеет названия перед функцией?Это особый вид функции?

  • В основном эта функция принимает обратный вызов в качестве слушателей, она определена и выполняется вместе?

_

 (function(handlers) {
  Object.keys(handlers).forEach(function(observableName) {
    var observable = app.ko.observable().extend({
      notify: 'always'
    });
    that[observableName] = observable;
    var f = handlers[observableName];
    if (f) {
      observable.subscribe(f);
    }
  });
})({
  onCallIgnored: defaultCallHandler,
  onCallStateChanged: function(call) {
    that.videoState(call.getRemoteVideoState());
  },
  onPlacingCall: function(call) {
    callParams = app.utils.cloneObj(call);
  },
  onIncomingCall: function(call) {
    that.activeCall = call;
    callParams = app.utils.cloneObj(call);
    setCallEstablishingTimeout();
    app.playSound("ringtone");
    that.callProgressTime("");
  },
  onUpdateCallInfo: function(call) {
    console.log(call);
  }
});

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Что это за функция с квадратными скобками слева, но без имени перед функцией?Это особый вид функции?

Функция представляет собой функцию anonymous, которая преобразуется в function expression, оборачивая () вокруг нее.И, добавив еще (), вы вызываете выражение функции.Такие выражения вызываемой функции известны как IIFE (выражение немедленного вызова функции), что означает, что вы вызываете функцию, как только она определена.

например

(function(x) {console.log(x);})(2); // paints 2

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

Да, функция определена и запущенавсе вместе.IIFE принимает значения, определенные в (), в качестве аргументов и передает их функции.

(function(arg1, arg2, ...argN){ ... // function definition})(param1, param2, ... paramN);

Итак, разбиение IIFE будет следующим:

определение функции

function(handlers) {
  Object.keys(handlers).forEach(function(observableName) {
    var observable = app.ko.observable().extend({
      notify: 'always'
    });
    that[observableName] = observable;
    var f = handlers[observableName];
    if (f) {
      observable.subscribe(f);
    }
  });
}

аргумент функции 1 (обработчики)

{
  onCallIgnored: defaultCallHandler,
  onCallStateChanged: function(call) {
    that.videoState(call.getRemoteVideoState());
  },
  onPlacingCall: function(call) {
    callParams = app.utils.cloneObj(call);
  },
  onIncomingCall: function(call) {
    that.activeCall = call;
    callParams = app.utils.cloneObj(call);
    setCallEstablishingTimeout();
    app.playSound("ringtone");
    that.callProgressTime("");
  },
  onUpdateCallInfo: function(call) {
    console.log(call);
  }
}
0 голосов
/ 24 мая 2018

Функция

(function(handlers) {
  ...
})()

представляет собой самовыполняющуюся анонимную функцию (также известную как выражение немедленного вызова функции).Подробное объяснение см. в этом руководстве .

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

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