jQuery:什么是“价值回调”?

时间:2012-07-03 00:08:44

标签: javascript jquery

我正在研究“学习jQuery”(第三版)。

在第4章:“操作DOM”中,有一节解释称为“ 值回调 ”的内容。对我来说这是一个新的。

作者通过一个链接列表示例解释了这一点,其中每个的ID必须是唯一的

从书中可以看出:

  

“值回调只是一个函数,而不是参数的值。然后在匹配集合中为每个元素调用一次该函数。从函数返回的任何数据都被用作新值。例如,我们可以使用这种技术为每个元素生成不同的id值,如下所示:“

     

Chaffer,Jonathan(2011-09-23)。学习jQuery,第三版(p.116)。 Packt Publishing。 Kindle版。

jQuery(document).ready(function($){

// get all external links
   $('div.chapter a').attr({
        rel:'external',
        title:'Learn more at Wikipedia',
        id: function ( index, oldValue ) {
                return 'wikilink-' + index;
        }
    });
})

像魅力一样工作,但id:property的 机制 逃脱了我。

  1. 参数1(索引) 知道 是一个整数吗?
  2. 该功能如何知道 增量 索引?
  3. 第二个参数(oldValue)如何知道保存属性的旧值(修改前)?
  4. 这是一个jQuery构造吗?一个JSON的东西?这很酷。它有效,但是... 这个“价值回调”的东西是什么?
  5. 请告知

2 个答案:

答案 0 :(得分:6)

  

1)参数1(索引)如何知道是一个整数?

jQuery传递一个整数。

  

2)函数如何知道增量索引?

回调不会增加index,jQuery方法会这样做。

  

3)第二个参数(oldValue)如何知道保存属性的旧值(修改前)?

jQuery传递它。

问题1-3的答案可能是通过执行与$.attr类似的功能最好地理解的:

Array.prototype.each = function (f) {
    var i;
    for (i=0; i < this.length; ++i) {
        f(i, this[i]);
    }
};

['zero', 'one', 'two'].each(function (i,item) {console.log({i: item})});

f是一个回调。 each负责迭代集合并为每个索引调用f&amp;项目。相同的代码结构可用于函数:

/* Map each item in a sequence to something else, 
 * returning a new sequence of the new values.
 */
Array.prototype.map = function (f) {
    var i, result = [];
    for (i=0; i < this.length; ++i) {
        result[i] = f(i, this[i]);
    }
    return result;
};

['zero', 'one', 'two'].map(function(i,item) {return item.length});
// result: [4, 3, 3]

/* Return a sequence of the items from this sequence 
 * for which 'keep' returns true.
 */
Array.prototype.filter = function (keep) {
    var i, result = [];
    for (i=0; i < this.length; ++i) {
        if (keep(i, this[i])) {
            result.push(this[i]);
        }
    }
    return result;
};

['zero', 'one', 'two'].filter(function(i,item) {return item.length <= 3});
// result: ['one', 'two']

执行mapconcatfoldl and foldr作为练习。作为另一项练习,请按map重写filtereach

请注意,这些功能仅用于说明回调的工作原理。它们可能会导致生产代码出现问题。

  

4)这是一个jQuery构造吗?一个JSON的东西?这很酷。它有效,但......这个“价值回调”的东西到底是什么?

Callbacks是jQuery广泛使用的通用技术。它们是functional programming的关键特性,其中函数是可以像其他数据类型一样操作的数据。因此,您具有将函数作为参数并可以返回函数的函数。在某些情况下,callbacks也称为“延续”,并构成continuation passing styleCPS)的基础。这对于asynchronous function calls [2](函数在计算完成之前返回,而不是synchronous calls)尤其重要,例如用于Ajax请求。要了解CPS的一些强大功能,请阅读"Use continuations to develop complex Web applications"

另一方面,“值回调”中的“值”是,由于JS是动态类型语言(类型与数据而不是变量相关联),因此形式参数可以绑定到任何对象类型。然后,函数可以根据传递的内容而有所不同。有时这是通过检查参数的类型来实现的,该参数的类型有效ad-hoc polymorphism(函数,而不是语言,必须处理调度)。但是,parametric polymorphism或(失败)duck typing应始终优先于检查参数类型。通过确保可以传递给给定函数的所有类型支持相同的接口(方法名称,参数,前置条件,后置条件等)来实现参数多态。例如,所有序列类型都应具有length属性并由整数索引;只要保持不变,就可以使用自己的序列类型和许多带数组的函数。

我不确定你对JSON的意思,但它可能不是通常的意思。 JSON是基于JS对象文字语法的有限版本的数据交换格式。 JSON不涉及示例代码或引用文本中的任何位置。

答案 1 :(得分:4)

这是一个JQuery构造。如果查看源代码,您会发现JQuery正在检查参数,以了解您是否传递了值或函数。如果它是一个函数,它会按你看到的那样处理。