为什么我不能直接将document.getElementById分配给不同的函数?

zjm*_*ler 11 javascript

所以我试图定义一个类似于document.getElementById的函数g().以下工作正常:

var g = function(id){return document.getElementById(id)};
Run Code Online (Sandbox Code Playgroud)

但为什么这个更直接的代码不起作用呢?

var g = document.getElementById;
Run Code Online (Sandbox Code Playgroud)

lon*_*day 13

问题在于背景.当您触发对象的函数时,它将以对象作为值触发this(除非您另行指定). g = document.getElementById将函数getElementById放入变量g,但不设置上下文.

因此,在运行时g(someId),没有可以运行该函数的上下文.它以全局对象window作为值运行this,但不起作用.(确切地说,它不起作用,因为您可以使用任何document对象操作,而不仅仅是window.document,并且您没有指定一个.)

可以call在设置上下文的地方解决这个问题:

g.call(document, someId);
Run Code Online (Sandbox Code Playgroud)

但是,这不是原来的改进!

  • 使用`call()`的最大问题是宿主对象的方法(例如`document`)不能保证是`Function`对象,因此可能没有`call()`方法.例如,`g.call(document,someId);`肯定不会在IE <8中工作,也可能在8中工作. (2认同)