Angular JS对象范围

时间:2016-08-04 13:06:30

标签: angularjs

我编写了一个简单的Angular JS代码,它根据一天中的时间来迎接用户。它工作正常。代码如下:

var modSvc = angular.module("appName",[]); 

modSvc.provider("date",function(){
    var greeting;
    return {
        showGreeting:function(value){
            greeting = value;
        },
        $get:function(){
            //it has to return an object which can have variables and functions
            return {
                showDate:function(){
                    var date = new Date();
                    return date.getHours();
                },
                showGreetingMessage:function(){                 
                    //var date = new Date();
                    return greeting + ", It's "+ this.showDate();
                }
            }
        }
    };
});

modSvc.config(function(dateProvider){
    var hours = dateProvider.$get().showDate();
    if(hours<12)
        dateProvider.showGreeting("Good morning!");
    else if(hours<17)
        dateProvider.showGreeting("Good afternoon!");
    else if(hours<22)
        dateProvider.showGreeting("Good evening!");
    else
        dateProvider.showGreeting("Good night!");
});

function serviceController($scope,date){
    $scope.greetingMessage = date.showGreetingMessage();
}

modSvc.controller("svcController",serviceController);

如果你看到showGreetingMessage函数,它只有一行代码:

return greeting + ", It's "+ this.showDate();

showDate函数与showGreetingMessage函数的级别相同。这就是this.showDate不应该起作用的原因,它应该给出错误。但它完美无缺。怎么回事?

1 个答案:

答案 0 :(得分:1)

这取决于所使用的JavaScript引擎,但根据Mozilla reference,您的“this”实际上引用了父对象,因为您要返回一个对象。

  

作为对象方法

     

当一个函数作为一个对象的方法被调用时,它被设置为调用该方法的对象。

     

在下面的例子中,当调用o.f()时,在函数内部将它绑定到o对象。

var o = {
  prop: 37,
  f: function() {
    return this.prop;
  }
};

console.log(o.f()); // logs 37