ECMAScript 3.1 的Strict模式

[有些小错误经过本人andrewstz修复了]

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

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

废话不说,翠花,上代码: 

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

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


			console.log('window.x1 === undefined:'+(window.x1 === undefined))
			f()
			console.log('window.x1 === 1:'+(window.x1 === 1))
        </script>
        <script>
            try {
                eval('x2 = 1')
            } catch(e) {
                console.log(e)
                console.log('strict模式字符串   能   放在后面')
            }
            // strict模式字符串能放在后面吗?
            "use strict"; //看来是不能啊
            try {
                eval('x3 = 1')
            } catch(e) {
                console.log(e)
                console.log('strict模式字符串   放在后面对前面的语句无效')
            }
            //后面这句也不打,放在中间都不行!!! 只能放在一个执行期的最前面才有效啊
        </script>
        <script>
			// 本段脚本是non-strict模式
			function f1() {
				// 此函数是non-strict模式
				// 此eval也是non-strict模式
				eval('x4 = 1')
			}

			function f2() {
				// 此函数启用了strict模式
				"use strict";
				// 此eval也是strict模式
				eval('x4 = 1')
			}
			f3 = new Function('"use strict"; x4 = 1;'); // 也是strict模式
			console.log('window.x4 === undefined:'+(window.x4 === undefined))
			try {
				f2()
			} catch(e) {
				try {
					f3()
				} catch(e) {
					f1()
				}
			}
			console.log('window.x4 === 1:'+(window.x4 === 1))
			/**
			 * 对比第一个例子可见 先"use strict"再 new Function,则里面的 无声明变量可以加到global,
			 * 而先new Function再在里面"use strict"则会异常,这是因为此时new Function不在严格模式下,里面的代码才在严格模式下。
			 * 
			 */			
        </script>

 总结:

1、"use strict"只能放在<script>或函数顶部才能使整块代码在严格模式。否则将失效

2、严格模式不允许eval中出现未var的变量(即eval不执行全局污染的语句)

3、new Function内的代码是non-strict的,除非用 "use strict"字符串声明new Function('"use strict"; x4 = 1;')

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

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

1. block中不能出现var定义,包括if、for、while、switch等结构中都不能有var定义! 
2. eval中的var/function声明被局部化(类似Function构造器): 

Java代码   收藏代码
  1. new function () {  
  2.   eval('var x=1; alert(x);')  // x is only accessible in the eval code  
  3.   alert(x);  // error  
  4. }  


3. eval只能直接调用,任何间接调用(如eval.call)或试图将eval赋给其他变量,都会扔出EvalError。 
4. 不能包含with语句! 
5. 不能使用caller和arguments.callee属性! 
6. 普通的函数调用中this是null,而不是global对象。 

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

你可能感兴趣的:(ECMAScript)