我正在使用angularjs和phonegap,并且遇到了我“知道”它做什么的代码,但是我不知道它是如何工作的。我仍然对高级js概念感到满意,因此,如果您可以描述一下,我将非常感激。
问题:
在回调注册中,我看不到在任何地方设置以下变量:arguments(第5行)和fn(第10行)。它们是否在函数原型中声明?
第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); }; }; });
最佳答案
arguments
是一个在函数内部始终可用的变量,并且是一个类似于数组的对象,包含传递给该函数的所有参数。使用Array.prototype.slice.call
的原因是因为arguments
并不是一个精确的数组(其对象具有顺序数字键0
,1
等),并且该代码是将其转换为数组的一种方式一个真正的JavaScript数组。fn
是在第2行传递给函数的参数,由于closures,第10行和第12行的内部函数可以使用它(因为内部函数可以访问其外部函数的所有变量,即使在外部函数之后也可以访问)返回)。
就apply
用this
进行调用而言,您是正确的,因为它设置了正在调用该函数的对象,从而设置了这些函数内部的this
对象。
但是,必须注意,this
的值是动态的,并且是在函数执行时而不是在声明函数时确定的。例如,在forEach
循环中,this
引用全局对象(可能是有意的),而不是触发deviceready
事件的对象。在最后一行,this
的值将取决于整个phonegapReady
回调的结果如何调用。