首页 > 代码库 > 作用域--高手都容易犯错的地方

作用域--高手都容易犯错的地方

在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];    }

怎么样,现在这个样子是不是变以不是那么容易发现了。其实简化一下,就得到了我上面那个例子。