use*_*187 79 javascript invocation
例如,如果我这样做:
var q = document.querySelectorAll;
q('body');
Run Code Online (Sandbox Code Playgroud)
我在Chrome中收到"非法调用"错误.我想不出为什么这是必要的任何理由.首先,并非所有本机代码功能都是如此.事实上我可以做到这一点:
var o = Object; // which is a native code function
var x = new o();
Run Code Online (Sandbox Code Playgroud)
一切正常.特别是在处理文档和控制台时我发现了这个问题.有什么想法吗?
Aln*_*tak 132
这是因为你失去了这个功能的"背景".
你打电话的时候:
document.querySelectorAll()
Run Code Online (Sandbox Code Playgroud)
该函数的上下文是document,并且将this通过该方法的实现来访问.
当你只是打电话q不再有上下文时 - 它就是"全局" window对象.
querySelectorAll尝试使用的实现,this但它不再是DOM元素,它是一个Window对象.实现尝试调用某个Window对象上不存在的DOM元素的方法,并且解释器毫不奇怪地调用了犯规.
要解决此问题,请.bind在较新版本的Javascript中使用:
var q = document.querySelectorAll.bind(document);
Run Code Online (Sandbox Code Playgroud)
这将确保所有后续调用都q具有正确的上下文.如果还没有.bind,请使用:
function q() {
return document.querySelectorAll.apply(document, arguments);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
36712 次 |
| 最近记录: |