子集和扩展
子集的定义大部分是出于安全考虑,只有使用这门语言的一个安全的子集编写脚本,才能让代码执行的更安全,更稳定,比如如何更安全的执行一段由不可信第三方提供的广告代码.
为了让JS代码静态的通过安全检查,必须移除一些JS特性:
1.eval()和Function()否早函数在任何安全子集里都是禁止使用的,因为他们可以执行任意代码,而且JS无法对这些代码做静态分析.
2.进制使用this关键字,因为函数(在非严格模式中)可以通过this访问全局对象.而沙箱系统的一个重要目的就是阻止对全局对象的访问.
3.禁止使用with语句,因为with语句增加了静态代码检查的难度.
4.禁止使用某些全局变量.在客户端JS中,浏览器窗口对象可以当做全局对象,但也具有双重身份,因此代码中不能有对window对性的引用.同样的,客户端document对象定义了可以用来操控整个页面内容的方法.将对document的控制权交给一段不受信任的代码会有很多隐患.安全子集提供了两种不同的方法来处理类似document这类全局对象.第一种方法是,沙箱完全禁掉他们,并定义一组自定义API用以对分配给它的web页面做有限制的访问.第二种方法,在沙箱代码所运行的”容器”内定义一个只对外提供安全的标准DOM API的”外观面板”或”document代理对象”
5.禁止使用某些属性和方法,以免在沙箱中的代码拥有过多的权限.这些属性和方法包括arguments对象的两个属性caller和callee,函数call()和apply(),,以及constructor和prototype两个属性.非标准的属性也被禁止了,比如_proto_,一些自己将这些不安全的属性和全局对象列进了黑名单,还有一些子集提供了白名单,给出了推荐使用的安全的属性和方法.
6.静态分析可以有效地防止带有点(.)运算符的属性存取表达式去读写特殊属性.但是使用方括号[]来访问属性则与此不同,因为我们无法对方括号内的字符串表达式做静态分析.基于这个原因,安全子集通常禁止使用方括号,除非方括号内是一个数字或者字符串直接量.安全子集将[]替换为全局函数,通过调用全局函数来查询和设置对象抽象,这些函数会执行运行时检查以确保它们不会读写那些禁止访问的属性.
安全子集:ADsafe,,dojox.secure,Caja,FBJS,Microsoft Web Sandbox,const pi =3,14;//定义一个常量并且赋值
关键字let有四种使用方式:
1.可以作为变量声明,和var一样
2.在for/in循环中,作为var的替代方案
3.在语句块中丁一一个新变量并显式指定它的作用域
4.定义一个在表达式内部作用域中的变量,这个变量旨在表达是内可用.
JSd扩展:结构赋值,迭代器,生成器yield,数组推到,函数简写,多catch从句.