当前位置: > > > JS - 严格模式使用详解(use strict)

JS - 严格模式使用详解(use strict)

ECMAscript 5 起,Javascript 除了有正常运行模式,还增加了第二种运行模式:"严格模式"(strict mode)。下面我们就来聊一聊严格模式。

一、基本介绍

1,什么是严格模式?

顾名思义,严格模式模式就是使得 Javascript 在更严格的条件下运行。比如:
  • 如果在语法检测时发现语法问题,则整个代码块失效,并导致一个语法异常。
  • 如果在运行期出现了违反严格模式的代码,则抛出执行异常。

2,使用严格模式的好处

  • 消除 Javascript 语法的一些不合理、不严谨之处,减少一些怪异行为;
  • 消除代码运行的一些不安全之处,保证代码运行的安全;
  • 提高编译器效率,增加运行速度;
  • 为未来新版本的 Javascript 做好铺垫。

3,浏览器支持情况

  • Internet Explorer 10 +IE6,7,8,均不支持严格模式)
  • Firefox 4+ 
  • Chrome 13+
  • Safari 5.1+
  • Opera 12+

二、如何开启严格模式

我们在如下位置加入 "use strict";(也可以用单引号)便可以开启相应代码块中的严格模式:

(1)在全局代码的开始处加入。
<script>
  "use strict";
  console.log("这是严格模式。");
</script>

(2)在函数声明代码开始处加入。
function strict(){
  "use strict";
  return "这是严格模式。";
}

(3)在 eval 代码开始处加入
eval('"use strict";/*局部严格模式*/');

(4)在 new Function() 所传入的 body 参数块开始加入。
var doAdd = new Function("iNum", "'use strict';alert(iNum + 20)");

三、严格模式对语法和行为的限制

1,变量必须声明才能使用

(1)变量 a 缺少 var 语句做声明,因此报错。
"use strict";
a=1;

(2)变量 b 未声明,因此报错。
"use strict";
var a=b=1;

2,闭包内的 this 不指向 Global 对象

比如下面代码,严格模式 alert 弹出的就是 undefined
"use strict";
(function(){
  alert(this); //输出undefined
})();

3,函数形参不能重复声明

"use strict";
function func(a,a){};

4,eval 拥有类似闭包的作用域

虽然同名,但 eval 内的变量不会影响到外部变量。
"use strict";

var a=1,b=1;
eval("var a=2");
window.eval("var b=2");

console.log("a:" + a);  //1
console.log("b:" + b);  //2

5,增加一些保留字(不能作为变量名)

(1)ECMAscript 第五版本身已规定一些保留字:class, enum, export, extends, import, super
(2)各大浏览器还自行增加的 const 保留字。
(3)严格模式新增了一些保留字:implements, interface, let, package, private, protected, public, static, yield
"use strict";
var implements = "hangge.com"

6,不允许对 arguments 其赋值

"use strict";

arguments++; // 语法错误
var obj = { set p(arguments) { } }; // 语法错误
try { } catch (arguments) { } // 语法错误
function arguments() { } // 语法错误
var f = new Function("arguments", "'use strict'; return 17;"); // 语法错误

7,arguments 不再追踪参数的变化

(1)正常模式
function f(a) {
  a = 2;
  return [a, arguments[0]];
}

f(1);

(2)严格模式
"use strict";

function f(a) {
  a = 2;
  return [a, arguments[0]];
}

f(1);

8,无法使用 arguments.callee

这意味着,我们无法在匿名函数内部调用自身了。
"use strict";
var f = function() {
  return arguments.callee;
};
f(); // 报错

9,无法使用 caller

我们无法通过 caller 获取到调用当前函数的函数的引用。
"use strict";

function a(){
    alert(a.caller); // 报错
}

function b() {
    a();
}

b();

10,无法使用 with 语句

"use strict";

with({});

11,一些原来在普通模式下的无效操作会变成错误

(1)比如无法删除 var 声明的变量。
"use strict";
var a = 1;
delete a;


(2)给只读属性赋值也会报错。
"use strict";
var o = {get a(){}};
o.a = 1;
评论0