Polyfill / fix用于在'function'之类的保留JS字上使用点符号

时间:2014-08-27 16:16:22

标签: javascript internet-explorer-8 polyfills

这个问题是this

的后续问题

背景:

var a = function(){ console.log("function is() initialized"); };

// assign a property named 'function' to function 'a'

a.function = function afunction(f){ return (typeof f === 'function'? true: false); };

// Use our is function to test if a given variable is a function

a.function(a); // IE throws 'expected identifier' error v/s Chrome correctly outputs "true"

解决方案

使用括号表示法来避免干扰,如here所述。

a["function"](a)代替a.function(a)

跟进问题

由于高级浏览器能够“绕过”调用a.function(a),是否有可用的polyfill / fix支持在保留的javascript单词上使用点表示法。在使用此polyfill / fill之后,应该能够在旧浏览器中继续使用点表示法(例如IE 8),即

允许使用a.function(a)代替a["function"](a)

1 个答案:

答案 0 :(得分:4)

我相当确定不存在这样的polyfill,因为行为的差异依赖于JavaScript语法的差异,它决定了如何将词法代码从一系列字符转换为可执行的指令的解析树。

ECMAScript 3语法(IE8使用)允许在点之后使用Identifier进行点属性访问,但ECMAScript 5语法(所有现代浏览器都使用)允许更广泛的IdentifierName按照点。差异很大,因为Identifier被定义为

  

IdentifierName 但不是 ReservedWord

因此,ECMAScript 3在点访问表达式中不允许保留字(如function)存在于语法级别。

在IE8中可以纠正此行为的polyfill需要在代码开始运行之前更改浏览器在分析时的行为方式。脚本无法改变浏览器JavaScript解析器的行为。

理论上可以通过ES5-to-ES3编译器运行代码,这会自动将a.function转换为a["function"]Mascara是我能找到的唯一可以满足您需求的项目,但重要的是要注意它的价格为980美元。