立即调用的函数表达式运行最后定义的函数。为什么呢?

时间:2015-11-21 19:10:26

标签: javascript iife

我遇到了一些奇怪的行为,在使用立即调用的函数表达式时我没想到会发生这种行为。当最后有一个IIFE时,下面的代码运行函数hello。为什么会这样?

var hello = function () {
    console.log("hello");
}

(function () {

})();

1 个答案:

答案 0 :(得分:3)

运行它,它不会

db.getCollection('patients').aggregate([    
    { "$group": { 
        "_id": null,             
        "param1_count": {
            "$sum": {
                "$cond": [ "$param1", 1, 0 ] /* similar to "$cond": [ { "$eq": [ "$param1", true ] }, 1, 0 ] */
            }
        },
        "param2_count": {
            "$sum": {
                "$cond": [ "$param2", 1, 0 ]
            }
        },
        "param3_count": {
            "$sum": {
                "$cond": [ "$param3", 1, 0 ]
            }
        },
        "param4_count": {
            "$sum": {
                "$cond": [ "$param4", 1, 0 ]
            }
        } 
    } },
    { "$project": {
        "_id": 0,             
        "param_counts": {
            "param1": "$param1_count",
            "param2": "$param2_count",
            "param3": "$param3_count",
            "param4": "$param4_count"
        }
    } }
])

这是因为JavaScript解释器将其理解为连续代码,除非您将var hello = function () { console.log("hello"); }; (function () { })(); 标记为语句的结尾。

您的代码

;

实际上就像这样

var hello = function () {
    console.log("hello");
}

(function () {
})();

解释器以var hello = function () { console.log("hello"); }(function(){})(); 作为参数立即运行hello函数,并为下一个function () {}抛出错误。