JavaScript函数混乱

时间:2014-05-20 14:35:48

标签: javascript angularjs

我正在学习AngularJS,并且有以下代码(来自我经历的视频教程)。

eventsApp.controller('EventController',
                    function EventController($scope, eventData) {
                        eventData.getEvent(function(event) {
                            $scope.event = event;
                        });

我对JavaScript eventData.getEvent(function(event) { }的这一点感到困惑我承认我的JavaScript知识并不超级,但与C#或Java函数/方法相比,JavaScript函数在这方面是如此奇怪。

我理解eventData是我的AngularJS服务,在那上面,我有一个名为getEvent()的方法,但不会将事件对象作为参数!这是我的AngularJS服务代码:

eventsApp.factory('eventData', function($http, $log) {
    return {
        getEvent: function(successcb) {
            $http({ method: 'GET', url: 'data/event/1.json' }).
            success(function(data, status, headers, config) {
                successcb(data);
            }).
            error(function(data, status, headers, config) {
                $log.warn(data, status, headers, config);
            });
        }
    }
});

即使我告诉自己"忽略对象类型和类(沿着C#/ Java行思考)并将其视为一个简单的对象",然后我仍然无法到达eventData.getEvent(function(event) { }中的>事件参数来自!

有人可以澄清一下吗?

由于

3 个答案:

答案 0 :(得分:2)

您实际上没有将event作为参数传递,您将整个函数作为参数传递为callback。当getEvent到达.success时,它会调用该函数(在服务中称为successcb),并传递data(其中data实际上是event您在控制器中看到的eventsApp.factory('eventData', function($http, $log) { return { getEvent: function() { $http({ method: 'GET', url: 'data/event/1.json' }). success(function(data, status, headers, config) { // successcb(data); // this is essentially what's happening, except in your controller... // ...so, this won't actually work because you don't have $scope in this service // but it's the same idea successcb(data); var successcb = function(event) { $scope.event = event; }; }). error(function(data, status, headers, config) { $log.warn(data, status, headers, config); }); } } }); 参数。

实际上看起来更像是这样:

{{1}}

答案 1 :(得分:1)

Javascript函数可以视为内联对象,可以作为参数传递。

例如,您可以使用以下内容(pseodo代码):

var x = function fun(){alert ('hi');};
callerFunction(x);

相同
callerFunction(function fun(){alert ('hi');});

上面是什么是背后的概念,所有现代JS库(如jQuery)都利用它将所有回调函数作为参数包含在内。

答案 2 :(得分:0)

您的服务方法正在等待变量REFERENCE_TO_FUNCTION。 也许这个例子会更清楚:

eventsApp.factory('eventData', function($http, $log) {
    return {
        getEvent: function(REFERENCE_TO_FUNCTION) {
            $http({ method: 'GET', url: 'data/event/1.json' }).
            success(function(data, status, headers, config) {
                REFERENCE_TO_FUNCTION(data);
            }).
            error(function(data, status, headers, config) {
                $log.warn(data, status, headers, config);
            });
        }
    }
});