angularjs 工厂内部函数不依赖于工厂?

angularjs factory internal functions not factory dependend?

我想在我的模块中有 2 个 classes(工厂)

angular.module('starter.services', [])

.factory("TPreferences",function($cordovaSQLite){
    _set = function(pName, pValue){
            console.log("Setting: "+pName+":"+pValue);
            }

    _addList = function(pList){
                for(var p=0; p < pList.length; p++)
                {
                    _set(pList[p].name, pList[p].value);
                }
            }


    return {
        init: function(){
                        _addList(gSettings);
        }
    }
})

.factory("TDayList",function($cordovaSQLite){
    _add = function(pName, pValue){
            console.log("Day: "+pName+":"+pValue);
            }

    _addList = function(pList){
        for(var p=0; p < pList.length; p++)
        {
            _add(pList[p].name,pList[p].value);
        }
    }

    return {
        init: function(){
                        _addList(gExampleDays);
                    }
    };

});

问题:调用TPreferences.init() 时,会记录"Day:..."。 我假设“.factory(...)”-Stuff 是一个 class,其中 _addList 是一个受保护的函数,但似乎 _addList 似乎(至少在模块范围内)是全局的并且被覆盖尽管在不同的工厂中,但第二个定义具有相同的名称。

问题:当然,在这个例子中我可以简单地更改其中一个函数的名称,但我更愿意像 class 那样处理工厂,这样我就可以两次使用内部函数的名称。那么,最明智的做法是什么?

but it seems that _addList seems to be (at least module-wide) global and is overwritten by the second definition

当然是全局的,因为你声明的是全局的。没有声明的初始化成为全局变量。所以永远不要忘记正确声明变量 (const, let, var):

const _addList = function(pList) {
  for (var p=0; p < pList.length; p++) {
    _set(pList[p].name, pList[p].value);
  }
}

您没有在您的工厂中使用 var,这使得这些功能成为全球性的。使用 var 或者如果可以使用 ES6,请使用 let 关键字:

.factory("TPreferences",function($cordovaSQLite){
    var _set = function(pName, pValue){
        console.log("Setting: "+pName+":"+pValue);
        }

    var _addList = function(pList){
            for(var p=0; p < pList.length; p++)
            {
                _set(pList[p].name, pList[p].value);
            }
        }


    return {
        init: function(){
                    _addList(gSettings);
        }
    }
})