如果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); };