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