当我尝试创建别名函数时,document.getElementById如下所示:
f = document.getElementById;
Run Code Online (Sandbox Code Playgroud)
但是,当我试着打电话时:
var e_fullname = f(“fullname”);
Run Code Online (Sandbox Code Playgroud)
它出现了一个错误: Could not convert JavaScript argument
以下是可以的:
var e_fullname = f.call(document, “funname”);
Run Code Online (Sandbox Code Playgroud)
你能告诉我为什么吗?
Ser*_*riu 26
调用函数有四种方法:
f(p1, p2)obj.f(p1, p2)f.apply(obj, [p1, p2]),f.call(obj, p1, p2)new f(p1, p2)在所有这些情况下,f它只是函数对象(具有[[Call]]内部属性的对象)的引用(指针).在所有这些情况下它的行为不同的是调用函数的方式,这很重要.
所以,f只是getElementById对象的引用,document.getElementById和之间没有区别someOtherHTMLElement.getElementById; 该函数不会阻止对引用它的对象的引用.
如果要绑定某个"所有者"对象,请使用以下bind方法:
var f = document.getElementById.bind(document);
Run Code Online (Sandbox Code Playgroud)
getElementById是一种文档方法.要调用它,解释器需要具有函数体本身,调用它的对象(在您的情况下为文档)和参数.
当你这样做时f = document.getElementById,你正在复制函数体,而不是要调用它的对象.
当你这样做:
f.call(document, “funname”);
Run Code Online (Sandbox Code Playgroud)
你提供了调用它的对象和参数.
如果你想能够直接调用f,你需要以某种方式获得存储在那里的"文档"对象.最简单的是:
var f = function(name){return document.getElementById(name)}
Run Code Online (Sandbox Code Playgroud)
这会创建一个闭包,它为您保留文档的值.
你也可以使用bind()来做同样的事情.
| 归档时间: |
|
| 查看次数: |
20335 次 |
| 最近记录: |