Js函数括在括号中而不调用括号

时间:2018-05-23 17:49:27

标签: javascript

据我所知,IIFE看起来像这样。

(function() {
  // Some code
})();

或者可能是

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

但我有一个类似于以下内容的js。

这些功能是IIFE吗?谁在打电话给他们?什么在调用它们?我可以放置调试器并调试方法。

(function (definition) {
    "use strict";

    if (typeof exports === "object" && typeof module === "object") {
        module.exports = definition( require('./chartiq') );
    } else if (typeof define === "function" && define.amd) {
        define(["chartiq"], definition);
    } else if (typeof window !== "undefined" || typeof self !== "undefined") {
        var global = typeof window !== "undefined" ? window : self;
        definition(global);
    } else {
        throw new Error("Only CommonJS, RequireJS, and <script> tags supported for quoteFeedSimulator.js.");
    }
})

(function(_exports){
  var CIQ=_exports.CIQ;
    var quoteFeedSimulator=_exports.quoteFeedSimulator={}; // the quotefeed object

    quoteFeedSimulator.generateGUID=function(){
            .......
    };

    quoteFeedSimulator.maxTicks=50000;

    // called by chart to fetch initial data
    quoteFeedSimulator.fetchInitialData=function (symbol, suggestedStartDate, suggestedEndDate, params, cb) {
            .......
    };

    // called by chart to fetch update data
    quoteFeedSimulator.fetchUpdateData=function (symbol, startDate, params, cb) {
            .......
    };

    // called by chart to fetch pagination data
    quoteFeedSimulator.fetchPaginationData=function (symbol, suggestedStartDate, endDate, params, cb) {
            .......
    };

    // utility function to format data for chart input; given simulator was designed to work with library, very little formatting is needed
    quoteFeedSimulator.formatChartData=function (response) {
        var feeddata=JSON.parse(response);
        var newQuotes=[];
            .......
        return newQuotes;
    };

    return _exports;

});

3 个答案:

答案 0 :(得分:2)

基本上它是一个IIFE,其中函数的参数本身就是一个函数。

移交函数是definition,它保留了稍后调用的函数。

(function (definition) {

})(function(_exports) { /* ... */ });

答案 1 :(得分:1)

在上面的代码中,第一个匿名函数:

function (definition) {
  ...
}

接受第二个匿名函数:

function (_exports) {
  ...
}

作为一个论点。然后从第一个函数的主体内调用第二个函数,并将var global作为参数从第一个函数的局部范围调用。正在发生的事情的简化版本:

// The following code will log 'hey'

(function(defenition) {
   const global = 'hey';
   definition(global);
)(function(_exports) {
   console.log(_exports);
});

答案 2 :(得分:1)

IIFE - 立即调用函数表达式。它意味着我们需要时可以调用函数表达式中的函数。与我们使用回调一样。

这意味着我们在另一个函数中调用一个函数作为参数,这样我们就可以在其中使用该参数化函数。 这是一个例子。

//This is my callback function/ IIFE
function foo(param){
  console.log("I am from foo - "+ param);
}

//I am creating another function who take foo function as a parameter.
(function(iamfoo){
  iamfoo(1); //foo will call with param 1
  console.log("I am calling foo"); // print this message
  iamfoo(2); //  agian foo will call with param 2
})(foo); // foo as a parameter

Output will be:

I am from foo - 1
I am calling foo
I am from foo - 2

我希望我澄清你的疑问。谢谢,让我知道你对此的疑问。