AngularJS - 在私有函数中使用'this'

时间:2015-12-03 11:34:56

标签: javascript angularjs

在我的Angular模块中,我有一个像这样的服务:

myApp.service( 'myService', function(){

    this.publicFunction1 = function(){
        ...
    };

    this.publicfunction2 = function(){
        ...
    };

    function privateFunction(){
        ...
    }
});

在某一点上,我需要从私人中调用一个“公共”功能,如下所示:

function somePrivateFunc(){
    this.publicFunction1();
    ...
}

但是'this'元素似乎在私有函数中不可见。我怎么能在里面调用publicFunction1()?

这是一个解决方法,但我想明白这种情况。有人能解释一下这里发生了什么吗?还有更好的方法吗?

myApp.service( 'myService', function(){

    var service = this;

    this.publicFunction1 = function(){
        ...
    };

    this.publicfunction2 = function(){
        ...
    };

    function privateFunction(){
        service.publicFunction1();
        ...
    }
});

3 个答案:

答案 0 :(得分:5)

保留this的参考 变量在外面,并在任何地方引用如下:

myApp.service('myService', function() {
    var self = this;
    this.publicFunction1 = function() {
        ...
    };

    this.publicfunction2 = function() {
        ...
    };

    function privateFunction() {
        ...
    }

    function somePrivateFunc() {
        self.publicFunction1();
        ...
    }
});

由于public函数是服务的一部分,而角度服务的执行上下文只是this关键字。但是,由于私有函数(普通javascript函数)不是服务的一部分,因此该函数不共享相同的执行上下文。因此,对于该私有函数,执行上下文只是全局window对象。因此,如果您在私有函数内部引用this,您将获得window对象。因此,要从普通的javascript函数(私有函数)调用服务函数,我们需要存储角this对象的引用。

希望这清楚你的怀疑。

答案 1 :(得分:3)

您可以在以下变量中为此创建引用:

myApp.service( 'myService', function(){
    var self = this; // creation of the variable here

    this.publicFunction1 = function(){
        ...
    };

    this.publicfunction2 = function(){
        ...
    };

    function privateFunction(){
        self.publicFunction1();
        ...
    }
});

编辑:解释为什么有必要,Angular是在依赖注入的基础上完成的(在这里阅读:https://docs.angularjs.org/guide/di)。例如,您将在控制器中添加“myService”作为依赖项,您将可以访问从“myService”定义创建的对象。

然后您就可以调用this.publicFunction1()。

另一方面,如果不添加此方法,则控制器中不存在此方法。

答案 2 :(得分:0)

在函数外部,声明一个如下变量:

var me = this;

然后你可以在函数中引用'外部'this