读书人

怎么将let结构(block scope)转换到当

发布时间: 2012-09-20 09:36:50 作者: rapoo

如何将let结构(block scope)转换到当前的JavaScript代码
本文是对如何将let结构转换到ES3代码的补充。

首先,原文所说的将let转换为with的方法有几个缺陷需要说明:

1. with虽然可附加一个新的scope,但是由于引入的是一个JS对象,所以Object.prototype上的属性也被引入了该scope。比方说你无法在with里访问外部的toString()方法,因为你访问到的实际上变成了Object.prototype.toString。

再来一个例子:



不过这个方式存在漏洞。【为什么呢?请读者自行思考。】

尽管如此,这个思路仍然揭示了一种可能,那就是如果能创建一个不带有prototype的“干净”的对象,则就克服了with的许多问题。

恰好,IE中的DOM对象正是这样一朵奇葩。我们希望挑选的DOM对象是,可任意产生新对象(因为我们需要许多的scope对象),可添加属性(理论上若该对象可作为其他对象的prototype也可,不过JScript禁止用非native JS对象作为prototype),并且本身固有属性越少越好,最好是光秃秃的(这样就避免覆盖固有属性造成的问题)。

经过我的研究,符合上述条件的最佳对象是一些collection对象(还有更好的选择么?欢迎读者提供线索)。比如document.createStyleSheet().rules 。这个对象上只有3个属性:constructor、length、item。

所以只剩下两个问题,一个是如果要用到的外部变量名为constructor/length/item,另一个是用到的外部变量是一个内部访问this引用的函数。

对于问题一,可以在转换时,对这三个名称做特殊处理(好在只有3个特例)。对于问题二,我们可以将with内的函数调用显式的绑定this。


以上。



读书人网 >JavaScript

热点推荐