2

我正在使用 angularjs 和 phonegap 并遇到了我“知道”它的作用的代码,但我不知道它是如何工作的。我仍然对高级 js 概念感到满意,所以如果你能稍微描述一下,我真的很感激。

问题:

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

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


    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);
            };
        };
    });


4

1 回答 1

4

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

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

就 go 的apply调用而言this,您是正确的,因为它设置了调用函数的对象,从而设置了this在这些函数中引用的对象。

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

于 2013-07-29T14:07:57.103 回答