javascript中的别名功能

vie*_*ean 18 javascript

可能重复:
如果Javascript具有一流的功能,为什么这不起作用?

当我尝试创建别名函数时,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

调用函数有四种方法:

  1. 函数调用: f(p1, p2)
  2. 方法调用: obj.f(p1, p2)
  3. 应用或调用调用:f.apply(obj, [p1, p2]),f.call(obj, p1, p2)
  4. 构造函数调用: 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)


Eri*_*ric 7

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()来做同样的事情.