2010年1月24日星期日

[note][精品]Javascript编程中的陷阱

今天看jQuery源码的时候发现了一个以前不知道的问题,代码如下
(function() {
slice=Array.prototype.slice;
jQuery.prototype = {
......
    slice: function() {
        return this.pushStack( slice.apply( this, arguments ),
            "slice", slice.call(arguments).join(",") );
    },
......
}
})();

当时怎么都看不明白为什么要递归slice方法,其实此处的slice方法是数组的slice方法。
仔细分析代码jQuery.prototype被赋值为一个对象,这个对象有slice方法,此方法内部是直接调用slice,而非this.slice
Javascript与Java不同的是它不会将slice看成是this.slice,而会从作用域链里查找slice。作用域与语法作用域是一样的。
故首先是到本函数的作用域未找到定义,然后到整个函数
(function() {
})();
的作用域找到了Array.prototype.slice方法。这样就容易理解了。
显然jQuery.prototype={...}不是一个语法作用域。

没有评论: