码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-08-13 00:35:04      阅读:268      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   使用   io   ar   问题   cti   

在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

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

标签:style   blog   color   使用   io   ar   问题   cti   

原文地址:http://www.cnblogs.com/afrog/p/3908501.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!