【问题标题】:javascript function callbackjavascript函数回调
【发布时间】:2013-07-29 14:02:51
【问题描述】:

我正在使用 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); }; }; });

【问题讨论】:

    标签: javascript angularjs cordova


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 2015-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多