函数的用法(函数(参数){

时间:2018-05-24 12:30:27

标签: javascript function

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

  • 这个左侧有括号但没有括号的功能是什么 功能前的名字?这是一种特殊的功能吗?

  • 基本上,此函数接受回调作为侦听器,是否已定义 和一起跑?

_

 (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 :(得分:1)

功能

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

是一个自执行的匿名函数(也称为立即调用的函数表达式)。见this tutorial 好的解释。

当这个代码由JS解释器执行时,它将使用您作为参数传递的一组处理程序立即定义并调用该函数。

答案 1 :(得分:1)

  

左边有括号但没有括号的功能是什么   功能前的名字?这是一种特殊的功能吗?

该函数是anonymous函数,通过在其周围包裹function expression将其转换为()。通过添加另一个(),您将调用函数表达式。这样的调用函数表达式被称为IIFE(立即调用函数表达式),这意味着您可以在定义函数后立即调用该函数。

e.g。

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