ECMAScript 3.1 的Strict模式

Mozilla的JavaScript引擎SpiderMonkey和Rhino很早开始引入了Strict模式,现在ES3.1规范草案将Strict模式进行了标准化。

在程序首或函数首使用Strict指令即可启用Strict模式。

废话不说,[url=http://www.cuihua.org]翠花[/url],上代码:


<script>
// 本段脚本启用了strict模式
use strict

function f() {
// strict模式代码中的函数也是strict的
try {
// strict模式代码中的eval也是strict的
eval('x = 1') // strict模式中对未声明过的x赋值会抛出异常,
// 而不会在global上创建x
} catch (e) {
new Function('x = 1')() // strict模式代码中的new Function
// 是non-strict的!
}
}

assert (window.x === undefined)
f()
assert (window.x === 1)

</script>

<script>
// 本段脚本是non-strict模式

function f1()
// 此函数是non-strict模式
// 此eval也是non-strict模式
eval('x = 1')
}

function f2() {
// 此函数启用了strict模式
use strict
// 此eval也是strict模式
eval('x = 1')
}

f3 = new Function('use strict; x = 1') // 也是strict模式

assert (window.x === undefined)
try { f2() } catch(e) {
try { f3() } catch(e) {
f1()
}}
assert (window.x === 1)

</script>

(注意,由于尚没有ES3.1的完整实现,所以以上代码只能远观,不可亵玩……)

除了变量都需声明外,strict模式的重要限制包括:

1. block中不能出现var定义,包括if、for、while、switch等结构中都不能有var定义!
2. eval中的var/function声明被局部化(类似Function构造器):
[code]
new function () {
eval('var x=1; alert(x);') // x is only accessible in the eval code
alert(x); // error
}
[/code]
3. eval只能直接调用,任何间接调用(如eval.call)或试图将eval赋给其他变量,都会扔出EvalError。
4. 不能包含with语句!
5. 不能使用caller和arguments.callee属性!
6. 普通的函数调用中this是null,而不是global对象。

其他不太重要的改变包括:赋值、++和--操作等用于只读属性、不可扩展对象时,delete操作用于不可删属性时,可能会扔出TypeError;赋值、delete操作还可能会扔出ReferenceError。函数不能有同名参数;修改arguments[n]不会影响对应的具名参数,反过来也一样。

注:以上据ES3.1 2008年12月的草案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值