AngularJS-'这'在私人活动中

AngularJS - Use of 'this' inside a private function

本文关键字:活动中 AngularJS-      更新时间:2023-09-26

在我的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();
        ...
    }
});

保留this的引用外部变量,并到处引用它,如下所示:

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

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

希望这能消除你的疑虑。

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

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"定义创建的对象。

然后您就可以调用这个.publicFunction1().

另一方面,如果你不添加这个,这个方法将不存在于你的控制器中。

在函数之外,声明一个变量,如下所示:

var me = this;

然后,您可以从函数中引用"外部"this