[有些小错误经过本人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构造器):
- new function () {
- eval('var x=1; alert(x);') // x is only accessible in the eval code
- alert(x); // error
- }
3. eval只能直接调用,任何间接调用(如eval.call)或试图将eval赋给其他变量,都会扔出EvalError。
4. 不能包含with语句!
5. 不能使用caller和arguments.callee属性!
6. 普通的函数调用中this是null,而不是global对象。
其他不太重要的改变包括:赋值、++和--操作等用于只读属性、不可扩展对象时,delete操作用于不可删属性时,可能会扔出TypeError;赋值、delete操作还可能会扔出ReferenceError。函数不能有同名参数;修改arguments[n]不会影响对应的具名参数,反过来也一样。
相关推荐
为了解决这些问题,ECMAScript 5标准引入了一个新的特性——严格模式(Strict Mode)。通过启用严格模式,开发者可以更好地控制自己的代码,并避免一些常见的陷阱。 #### 二、严格模式概述 ##### 2.1 定义 严格...
JavaScript的严格模式是ECMAScript 5版本新增的一种运行模式,目的在于让JavaScript代码的编写更加严谨,提高代码的安全性和执行效率。在严格模式中,代码的语法和行为会有一些变化,帮助开发者避免一些常见的错误和...
JavaScript 5版本发布于2009年,包含了一些重要的新特性,如严格模式(use strict)、数组的forEach、map、filter等方法,以及Object.create和JSON对象。 总结,"JavaScript帮助手册(版本5)"是学习JavaScript的重要...
2.1 元素 ... async: 表示应立即下载脚本,但不应妨碍页面中的而其他操作,比如下载资源或等待...ECMAScript5引入严格模式的概念(strict mode),严格模式是为JavaScript定义了一种不同的解析和执行模型。启用严格模式:
这一年,ECMAScript 3.1(后来被称为ECMAScript 5)正在制定中,这为JavaScript引入了许多新特性,如严格模式('use strict')、对象字面量改进、数组和对象的遍历方法(如forEach和for...in循环改进),以及JSON...