在js中,我们都知道,this的指向是由它被调用时的上下文所决定的。例如:
window.id = 888; var data = { 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]; }
怎么样,现在这个样子是不是变以不是那么容易发现了。其实简化一下,就得到了我上面那个例子。
作用域--高手都容易犯错的地方,布布扣,bubuko.com
时间: 2024-09-30 15:33:09