zepto.1.1.6.js源码中的each方法学习笔记
each方法接受要遍历的对象和对应的回调函数作为参数,它的作用是:
1、如果要遍历的对象是类似数组的形式(以该对象的length属性值的类型是否为number类型来判断),那么就把以要遍历的对象为执行环境,将回调函数放到该执行环境中去循环执行length次;
2、如果要遍历的对象不类似数组,那么用for key in obj 的方法循环执行回调函数key次,同样以要遍历的对象为执行环境,将回调函数放到该执行环境中去循环执行。
function each(elements, callback){
//定义each的回调函数的参数
var i, key
//如果elements参数的length是一个number类型,可能是数组、字符串、arguments对象等
if (typeof elements.length == "number") {
for (i = 0; i < elements.length; i++)
//call(thisObj,arg1,arg2,....); 第一个参数是执行环境对象,后面都是传递的数据
//如果回调函数在elements[i]这个执行环境中,使用i和elements[i]这两个参数执行的结果为null、undefined,那么将elements原样返回
if (callback.call(elements[i], i, elements[i]) === false) return elements
} else {
for (key in elements)
if (callback.call(elements[key], key, elements[key]) === false) return elements
} return elements
};
用法很简单,就不举例子了。
因为正在学习this,所以我想知道在回调函数里面输出this是怎么个情况,于是我这样玩了一下:
var o = {"a":"sdfsdf","s":3};
each(o,function(i,ele){
console.log(this); });
在谷歌浏览器的console.log控制台居然是得到这样的结果:String {0: "s", 1: "d", 2: "f", 3: "s", 4: "d", 5: "f", length: 6, [[PrimitiveValue]]: "sdfsdf"}
这是因为回调函数的执行环境是elements[key],在本例中也就是o[a],而第一次遍历传入的参数也就成了o[a],而o[a]的值是一个字符串"sdfsdf",那么this很自然就指向了这个字符串对象
将字符串在console控制台作为一个对象输出时,自然就得到对象的属性树,但是如果是在html页面中使用document.write输出,那就会得到这个字符串的值;
以下例子可以证明:
function test(){
console.log(this);
} var str = "sdfsdfsdf"; test.call(str);
//在控制台得到:String {0: "s", 1: "d", 2: "f", 3: "s", 4: "d", 5: "f", 6: "s", 7: "d", 8: "f", length: 9, [[PrimitiveValue]]: "sdfsdfsdf"}
//在html页面中输出得到字符串的值:sdfsdfsdf
zepto.1.1.6.js源码中的each方法学习笔记的更多相关文章
- MVVM架构~knockoutjs系列之从Knockout.Validation.js源码中学习它的用法
返回目录 说在前 有时,我们在使用一个插件时,在网上即找不到它的相关API,这时,我们会很抓狂的,与其抓狂,还不如踏下心来,分析一下它的源码,事实上,对于JS这种开发语言来说,它开发的插件的使用方法都 ...
- Vue.js源码中大量采用的ES6新特性介绍:模块、let、const
1 关于ES6 ECMAScript6(以下简称ES6)是JavaScript语言的最新一代标准,发布于2015年6月,因为ECMA委员会决定从ES6起每年更新一次标准,因此ES6被改名为E ...
- zepto源码--几个判断函数--学习笔记
几个需要经常用到的类型判断: 自定义一个类似于typeof的函数,提供更多的类型判断. class2type[toString.call(obj)] 是对class2type的取值 在后面通过循环对c ...
- FCL源码中数组类型的学习及排序函数Sort函数的分析
Array 是所有数组的基类ArrayList 解决了所有Array 类的缺点 能动态扩容, 但是类型不安全的,而是会有装箱与拆箱的性能开销List<T> 则是解决了ArrayLis ...
- Java源码之 java.util.concurrent 学习笔记01
准备花点时间看看 java.util.concurrent这个包的源代码,来提高自己对Java的认识,努力~~~ 参阅了@梧留柒的博客!边看源码,边通过前辈的博客学习! 包下的代码结构分类: 1.ja ...
- JS和JQuery中的事件托付 学习笔记
事件托付事实上并非一个非常高级的技巧,比方在一个页面里面.当仅仅存在两个button的时候.可能你给button加入监听是这种:(本文不考虑浏览器兼容性.关于事件的兼容性可參考前面的学习笔记) < ...
- 不错的anroid源码在线浏览网站【学习笔记】
不错的anroid源码在线浏览网站:http://androidxref.com/
- 深入理解unslider.js源码
最近用到了一个挺好用的幻灯片插件,叫做unslider.js,就想看看怎么实现幻灯片功能,就看看源码,顺便自己也学习学习.看完之后收获很多,这里和大家分享一下. unslider.js 源码和使用教程 ...
- 从template到DOM(Vue.js源码角度看内部运行机制)
写在前面 这篇文章算是对最近写的一系列Vue.js源码的文章(https://github.com/answershuto/learnVue)的总结吧,在阅读源码的过程中也确实受益匪浅,希望自己的这些 ...
随机推荐
- sql 数据库备份还原脚本
/**功能:数据库备份*dbname:数据库名称*bakname:备份名称,包含完整路径*/use master BACKUP DATABASE dbname TO disk='c:\bakName' ...
- map和reduce
map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回. map()传入的第一个参数是f,即函数对象本身.由于 ...
- [Google Code Jam (Round 1A 2008) ] A. Minimum Scalar Product
Problem A. Minimum Scalar Product This contest is open for practice. You can try every problem as ...
- LeetCode_Simplify Path
Given an absolute path for a file (Unix-style), simplify it. For example, path = "/home/", ...
- java设计模式--结构型模式--装饰模式
装饰模式 概述 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 适用性 1.在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职责. 2.处理 ...
- cf486C Palindrome Transformation
C. Palindrome Transformation time limit per test 1 second memory limit per test 256 megabytes input ...
- unix c 03
C程序员的错误处理 errno/perror/strerror 都是系统设计好的 自定义函数中的错误处理 1 可以返回-1 代表错误 2 指针类型可以用 NULL 代表错误 ...
- JQuery DOM 有关代码练习
//累加你选择的个数 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <hea ...
- 主题简介 ASP .NET
由控件的外观.样式组成的集合,由一个文件组构成,存放在App_Themes文件夹下. 主题包括:皮肤文件(.Skin).CSS文件(.CSS).图片.其它资源等. 主题的作用:统一设置Web页面的外观 ...
- Bin & Jing in wonderland(概率,组合数学)
Problem 2103 Bin & Jing in wonderland Accept: 201 Submit: 1048 Time Limit: 1000 mSec Memor ...