Polyfill/fix用于在保留的JS单词(如'函数'

Polyfill/fix for using dot notation on reserved JS words like 'function'

本文关键字:函数 单词 JS fix 用于 保留 Polyfill      更新时间:2023-09-26

这个问题是这个的后续问题

背景:

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"

解决方案

使用括号符号以避免此处所述的干扰,即

a["function"](a)而不是a.function(a)

后续问题

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

允许使用a.function(a)而不是a["function"](a)

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

ECMAScript 3语法(IE8使用)允许在点后使用Identifier访问点属性,但ECMAScript5语法(所有现代浏览器都使用)允许更宽的IdentifierName跟随点。差异是显著的,因为Identifier被定义为

标识符名称 但不是 保留字

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

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

理论上,可以通过ES5到ES3编译器运行代码,该编译器会自动将a.function转换为a["function"]。睫毛膏是我能找到的唯一适合你需求的项目,但需要注意的是,它的价格为980美元。