javascript函数回调
我正在与angularjs和phonegap合作,偶然发现这段代码,我“知道”它的功能,但我不知道它是如何工作的。我仍然对Advanced js概念感到满意,所以如果您能稍微描述一下,我会非常感激 问题:javascript函数回调,javascript,angularjs,cordova,Javascript,Angularjs,Cordova,我正在与angularjs和phonegap合作,偶然发现这段代码,我“知道”它的功能,但我不知道它是如何工作的。我仍然对Advanced js概念感到满意,所以如果您能稍微描述一下,我会非常感激 问题: 在回调注册中,我没有看到在任何地方设置以下变量:arguments(第5行)和fn(第10行)。它们是否在函数原型中声明 第9行和第15行的代码块是否只是设置了“this”值,以便在回调中“this”值指向同一个对象?我们将这种应用“this”值的技术称为什么 是函数中始终可用的变量,是一个类
Array.prototype.slice.call
,是因为arguments
不是一个精确的数组(它是一个具有顺序数字键0
,1
等的对象),而该代码是将其转换为真正的JavaScript数组的一种方法
fn
是传递到第2行函数中的参数,可用于第10行和第12行的内部函数,因为(内部函数可以访问其外部函数的所有变量,即使在外部函数返回后)
对于使用this
go进行的apply
调用,您是正确的,因为它设置了调用函数的对象,从而设置了这些函数中this将引用的对象
但是,需要注意的是,的值是动态的,在执行函数时确定,而不是在声明函数时确定。例如,在forEach
循环中,this
指的是全局对象(可能是预期的),而不是触发devicerady
事件的对象。在最后一行中,this
的值取决于整个phonegapReady
回调的结果如何调用。是一个变量,在函数内部始终可用,是一个类似数组的对象,包含传递给函数的所有参数。之所以使用Array.prototype.slice.call
,是因为arguments
不是一个精确的数组(它是一个具有顺序数字键0
,1
等的对象),而该代码是将其转换为真正的JavaScript数组的一种方法
fn
是传递到第2行函数中的参数,可用于第10行和第12行的内部函数,因为(内部函数可以访问其外部函数的所有变量,即使在外部函数返回后)
对于使用this
go进行的apply
调用,您是正确的,因为它设置了调用函数的对象,从而设置了这些函数中this将引用的对象
但是,需要注意的是,的值是动态的,在执行函数时确定,而不是在声明函数时确定。例如,在forEach
循环中,this
指的是全局对象(可能是预期的),而不是触发devicerady
事件的对象。在最后一行中,this
的值取决于调用整个phonegapReady
回调的结果
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);
};
};
});