javascript函数回调

时间:2013-07-29 14:02:52

标签: javascript angularjs cordova

我正在使用angularjs和phonegap并且越过这段代码,我“知道”它的作用,但我不知道它是如何工作的。我仍然对先进的js概念感到满意,所以如果你有点描述性的话,我真的很感激。

问题:

  1. 在回调注册中,我没有在任何地方看到以下变量:arguments(第5行)和fn(第10行)。它们是在函数原型中声明的吗?

  2. 第9行和第15行的代码块是否设置了“this”值,以便在回调中“this”值指向同一个对象?我们称这种技术应用“这个”值是什么?

  3. 
        myApp.factory('phonegapReady', function() {
            return function (fn) {
               var queue = [];
               var impl = function () {
                   queue.push(Array.prototype.slice.call(arguments));    
                };
    
                document.addEventListener('deviceready', function () {
                    queue.forEach(function (args) {
                        fn.apply(this, args);
                    });
                   impl = fn;
                }, false);
    
                return function () {
                     return impl.apply(this, arguments);
                };
            };
        });
    
    
    

1 个答案:

答案 0 :(得分:4)

arguments是一个在函数内始终可用的变量,它是一个类似于数组的对象,它包含传递给函数的所有参数。使用Array.prototype.slice.call的原因是因为arguments不是一个完全一个数组(它是一个具有连续数字键01等的对象,并且代码是将其转换为真正的JavaScript数组的一种方式。

fn是在第2行传递给函数的参数,由于closures,内部函数可以访问第10行和第12行的内部函数(内部函数可以访问其外部的所有变量)函数,即使在外部函数返回之后)。

对于带有apply的{​​{1}}调用,你是正确的,因为它设置调用函数的对象,从而在那些对象中引用什么对象this功能

但是,重要的是要注意this的值是动态的,并且在执行函数时确定,而不是在声明函数时确定。例如,在this循环中,forEach引用全局对象(可能是预期的),而不是引发this事件的对象。在最后一行中,deviceready的值将取决于调用整个this回调的结果。