封装$

let $ = document.body.querySelectorAll;
$('#wrap'); //报错:Uncaught TypeError: Illegal invocation

有些小伙伴应该尝试过以上的操作吧~~这个是为什么呢?报错也说得不明不白,只是说“不合法的调用”,下面我来解释一下吧~

 再来看下这个:

let haha = console.log;
haha('12345'); //12345

这里没有报错,这是为什么呢?都是用一个变量装载系统内置的函数,为什么一个可以运行,一个就报错呢?

上网查了一下解决方法,很简单,就是把querySelectorAll绑定到对应的对象上:

let $ = document.querySelectorAll.bind(document);
$('#wrap'); //正常返回了,不报错

这样就可以大概猜测到为什么报错了,因为querySelectorAll里面有对this的调用,这也是js的痛点,this是多么脆弱啊~~

原文地址:https://www.cnblogs.com/amiezhang/p/7998450.html