首页 > 代码库 > 作用域--高手都容易犯错的地方
作用域--高手都容易犯错的地方
在js中,我们都知道,this的指向是由它被调用时的上下文所决定的。例如:
window.id = 888;var data =http://www.mamicode.com/ { id : 999, getId : function(){ console.log(this.id) }}data.getId(); // 999;var getId = data.getId;getId(); // 888
当我们在data上调用getId方法时,this显然是指向data对象的。这个很好理解,我们需要注意的是,当我们把data上的getId方法赋给一个变量的时候,这个时候的作用域,就悄悄地发生了变化,通常都会指向最外层的作用域上。比如window对象。
通常认为,把某个对象上的方法赋给一个局部变量保存,是一种优化,但是当涉及到方法体内有this的时候,就要小心了。当然,可以使用call,apply,bind等改变作域,但是在这个例子上,这样做是简单问题复杂化了。
或许你会认为这么简单的道理,高手怎么会犯呢?常言道,淹死的都是会游泳的。下面我发一段摘到艾伦项目里的一段bug:
//扫描边界 //扫描key的左右边界 //当前页面的左右边 MasterProto.scanBounds = function(currPage, currkey) { var recordParallaxMaster = this.recordParallaxMaster, currKey = recordParallaxMaster[currPage], filter = {}, i = currPage, prevKey, nextKey; //往前 while (i--) { prevKey = recordParallaxMaster[i]; if (prevKey && prevKey !== currkey) { filter[‘prev‘] = prevKey; break; } } //往后 nextKey = recordParallaxMaster[currPage + 1]; //如果有下一条记录 if (nextKey && nextKey !== currkey) { //如果不是当期页面满足范围要求 filter[‘next‘] = nextKey; } //当前页面 if (currKey) { filter[‘curr‘] = currKey; } return filter; }//page转化成母版ID MasterProto.recordParallaxMaster= function(pageIndex) { return this.recordParallaxMaster[pageIndex]; }
怎么样,现在这个样子是不是变以不是那么容易发现了。其实简化一下,就得到了我上面那个例子。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。