我正在使用angularjs和phonegap并且越过这段代码,我“知道”它的作用,但我不知道它是如何工作的。我仍然对先进的js概念感到满意,所以如果你有点描述性的话,我真的很感激。
问题:
在回调注册中,我没有在任何地方看到以下变量:arguments(第5行)和fn(第10行)。它们是在函数原型中声明的吗?
第9行和第15行的代码块是否设置了“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);
};
};
});
答案 0 :(得分:4)
arguments
是一个在函数内始终可用的变量,它是一个类似于数组的对象,它包含传递给函数的所有参数。使用Array.prototype.slice.call
的原因是因为arguments
不是一个完全一个数组(它是一个具有连续数字键0
,1
等的对象,并且代码是将其转换为真正的JavaScript数组的一种方式。
fn
是在第2行传递给函数的参数,由于closures,内部函数可以访问第10行和第12行的内部函数(内部函数可以访问其外部的所有变量)函数,即使在外部函数返回之后)。
对于带有apply
的{{1}}调用,你是正确的,因为它设置调用函数的对象,从而在那些对象中引用什么对象this
功能
但是,重要的是要注意this
的值是动态的,并且在执行函数时确定,而不是在声明函数时确定。例如,在this
循环中,forEach
引用全局对象(可能是预期的),而不是引发this
事件的对象。在最后一行中,deviceready
的值将取决于调用整个this
回调的结果。