Function.prototype.bind在IE中不起作用,即使在它应该受支持的版本中也是如此

时间:2014-07-29 04:08:22

标签: javascript internet-explorer cross-browser

以下脚本在IE 9,IE 10,IE 11

中不起作用
var a = location;
var b = 'toString'
var c = a[b].bind(a);
c(); // "Invalid calling object in IE"

对此有任何解决方法吗?

编辑 - 链接问题中提供的MDN垫片不起作用!!它们适用于IE 8!我对IE的问题> 8其中Function.bind是"支持"。

2 个答案:

答案 0 :(得分:4)

Internet Explorer因为直接访问Host对象(如locationconsole)而臭名昭着,而不像Chrome和Firefox那样提供“Javascript包装”。

要模拟“绑定”功能,你必须使用一个包装函数,它不是很漂亮,但可以完成这项工作:

function bindHost(bindingContext, methodName) {
    return function(arg0, arg1, arg2) {
        if (arguments.length === 0) {
            bindingContext[methodName]();
        } else if (arguments.length === 1) {
            bindingContext[methodName](arg0);
        } else if (arguments.length === 2) {
            bindingContext[methodName](arg0, arg1);
        } else {
            // (Repeat the else-if blocks, if you require 3+ args)
        }
    }
}

并像这样使用它:

var locationToStringBound = bindHost(location, 'toString');
locationToStringBound();

答案 1 :(得分:3)

locationa host object - 即使在ES5中,主机对象也只保证一件事 - 不遵循普通JavaScript对象的规范。

  预计ECMAScript程序的计算环境不仅会提供本规范中描述的对象和其他设施,还会提供某些特定于环境的主机对象,其描述和行为超出了此规范除了表明它们可以提供可以访问的某些属性以及可以从ECMAScript程序调用的某些函数。 [强调添加]

toString不属于the guaranteed interface of all JS objects (including host objects) - 因此任何都是可能的,包括遗憾的是您所描述的行为。