2016-08-04 3 views
0

Я написал простой угловой код JS, который приветствует пользователя в зависимости от времени суток. Он работает нормально. Код приведен ниже:Угловая область объекта 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

Это зависит от используемого двигателя JavaScript, но в соответствии с Mozilla reference ваш «этот» на самом деле ссылается на родительский объект, так как вы возвращаете объект.

В качестве метода объекта

Когда функция вызывается как метод объекта, его установке на объекте метод вызывается далее.

В следующем примере, когда вызывается o.f(), внутри функции это связано с объектом o.

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

console.log(o.f()); // logs 37 
Смежные вопросы