http://www.ruanyifeng.com/blo...
阮一峰的博客提到$的替代方法:
var $ = document.querySelectorAll.bind(document);
让我比较在意的是最后那个bind
按理说querySelectorAll
是作为document
的方法调用的, 执行上下文已经是document
了啊, 为什么还要再bind
一次呢?
比如: 执行如下代码:
var select = document.querySelectorAll;
select('span');
会报错
VM2761:1 Uncaught TypeError: Illegal invocation(…)
而
select.call(document, 'span');
就会得出正确结果了.
求解!~
这个问题其实和
querySelectorAll
没什么关系。document
是类的一个实例,而querySelectorAll
是原型链上的方法。类比到普通的类和原型方法就很好理解了吧。
通过实例来运行原型链上的方法时,解释器会自动将this指向那个实例
但是直接这样
var select = document.querySelectorAll;
,你的变量仅仅是指向了原型链上的那个函数,而没有绑定this指针,所以你才需要在外面手动绑定一下指针。