以下作品:
$ = document.form;
x = $.name.value;
这不是:
$ = document.getElementById;
x = $("id").value;
有关为什么不起作用或如何制作的任何想法?
答案 0 :(得分:11)
this
的值取决于您如何调用该函数。
当您致电document.getElementById
时,getElementById
会获得this === document
。当您将getElementById
复制到其他变量,然后将其称为$
,然后this === window
(因为window
是默认变量)。
这会导致它在窗口对象中而不是在文档对象中查找id,并且由于窗口不是文档而且没有相同的方法,因此会失败。
您需要在通话中保持document
。您可以使用包装函数,例如
function $ (id) { return document.getElementById(id); }
...但请不要使用$
。这是一个可怕的名字。它没有任何意义,它会让看到它的人感到困惑并想到“啊!我知道jQuery!”或者“啊!我知道原型”等等。
答案 1 :(得分:4)
上下文对象不同。当您获得函数的引用时,您正在更改该上下文对象:
var john = {
name : "john",
hello : function () { return "hello, I'm " + this.name }
}
var peter = { name : "peter" };
peter.hello = john.hello;
peter.hello() // "hello, I'm peter"
如果您希望绑定到特定上下文对象的引用函数,则必须使用bind:
peter.hello = john.hello.bind(john);
peter.hello(); // "hello, I'm john"
所以在你的情况下它将是:
var $ = document.getElementById.bind(document);
答案 2 :(得分:1)
getElementById
是HTMLDocument
原型的一种方法(其中document
是一个实例)。因此,在全局上下文中调用该函数肯定会得到“错误的错误”或其他内容。
您可以使用
var $ = document.getElementById.bind(document);
但
function $(id) { return document.getElementById(id); }
也可以,也许更好理解。
答案 3 :(得分:1)
不知道你想要实现什么,但这可以像这样工作
$ = document.getElementById;
x = $.call(document, "id").value;
因为getElementById
只是document
的函数,因为它需要的范围才有效。
但我会推荐@ Quentin的答案。
答案 4 :(得分:0)
如果你想要达到类似的效果,我建议使用jQuery。他们的$符号比仅通过id获取元素要强大得多。
此外,如果您使用的任何平台已经使用$作为变量(ASP .Net有时会使用它),您可能会产生不可预测的结果。