如果Javascript具有一stream的function,为什么这不起作用?

JavaScript声称有一stream的function,所以这似乎像下面的工作:

var f = document.getElementById; var x = f('x'); 

但是它在所有的浏览器上都失败了,每个浏览器上都有一个不同的错误信息。 Safari说“types错误”。 Chrome说“非法调用”。 Firefox说“不能转换Javascript参数”。

为什么?

因为JavaScript函数没有绑定到上下文( this )。 你可以使用bind()

 var f = document.getElementById.bind(document); 

当你在Javascript中调用obj.method() ,这个方法被传递给obj 。 调用document.getElementById('x') ,因此将其设置为document

但是,如果你只写了f = document.getElementById你现在有了一个新的函数引用,但是引用不再被“绑定”到document

所以你的代码不起作用,因为当你调用f作为一个裸函数名称时,它最终绑定到全局对象( window )。 只要函数的内部试图使用它,它发现它现在有一个window而不是一个document ,毫不奇怪,它不喜欢它。

如果你打电话给你,你可以f工作:

 var x = f.call(document, 'x'); 

它调用f但明确地设置上下文来document

其他解决这个问题的方法是使用仅在ES5中可用的Function.bind()

 var f = document.getElementById.bind(document); 

并且实际上只是创build自己的包装器的一般化捷径,可以正确设置上下文:

 function f(id) { return document.getElementById(id); } 

使用ES6的扩展运算符,你也可以尝试:

 function f(){ return document.getElementById(...arguments); }; 

巴贝尔给出了这个:

 function f() { var _document; return (_document = document).getElementById.apply(_document, arguments); };