我正在研究"学习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;
}
});
})
Run Code Online (Sandbox Code Playgroud)
工程就像一个魅力,但机制的ID:财产逃避我.
请指教
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})});
Run Code Online (Sandbox Code Playgroud)
f是一个回调.each负责迭代集合并调用f每个索引和项目.相同的代码结构可用于函数:
/* 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']
Run Code Online (Sandbox Code Playgroud)
执行mapconcat,foldl并foldr作为练习留下.作为另一种练习,重写map和filter方面each.
请注意,这些函数仅用于说明回调的工作原理.它们可能会导致生产代码出现问题.
4)这是一个jQuery构造吗?一个JSON的东西?这很酷.它有效,但......这个"价值回调"的东西到底是什么?
回调是jQuery广泛使用的通用技术.它们是函数式编程的关键特性,其中函数是可以像其他数据类型一样操作的数据.因此,您具有将函数作为参数并可以返回函数的函数.在某些情况下,回调也称为"延续",并形成持续传递风格(CPS)的基础.这对于异步函数调用 [ 2 ](其中函数在计算完成之前返回,而不是同步调用)尤其重要,例如用于Ajax请求.要了解CPS的一些功能,请阅读"使用continuation开发复杂的Web应用程序".
另一方面,"值回调"中的"值"是,由于JS是动态类型语言(类型与数据而不是变量相关联),因此形式参数可以绑定到任何类型的对象.然后,函数可以根据传递的内容而有所不同.有时这是通过检查参数的类型来实现的,这实际上是ad-hoc多态(函数,而不是语言,必须处理调度).但是,参数多态或(失败)鸭子打字应始终优先于检查参数类型.通过确保可以传递给给定函数的所有类型支持相同的接口(方法名称,参数,前置条件,后置条件等)来实现参数多态.例如,所有序列类型都应该具有length属性并由整数索引; 只要保持不变,就可以使用自己的序列类型和许多带数组的函数.
我不确定你的意思是JSON,但它可能不是通常所说的.JSON是基于JS对象文字语法的有限版本的数据交换格式.JSON不涉及示例代码或引用文本中的任何位置.
| 归档时间: |
|
| 查看次数: |
1177 次 |
| 最近记录: |