首页 > 解决方案 > 函数(function(parameter){

问题描述

我对以下代码有几个问题:

_

 (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);
  }
});

标签: javascriptfunction

解决方案


这是什么类型的函数,左侧有括号但函数之前没有名称?这是一种特殊的功能吗?

该函数是一个通过环绕它anonymous转换为 a的函数。通过添加另一个,您正在调用函数表达式。此类调用的函数表达式称为IIFE(立即调用函数表达式),这意味着您在定义函数后立即调用该函数。function expression()()

例如

(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);
  }
}

推荐阅读