javascript中严格模式的使用

严格模式是ES5中添加的一种特殊的执行模式,提供错误检测,增强了安全性

语法:

"use strict"
  • 全局使用strict
  • 函数内使用

1: 全局变量

在strict模式下,不可以给一个为声明的变量赋值

正常模式:

<script>
	a = 1;
	console.log(a)
</script>

1

严格模式:

<script>
	"use strict"
	a = 1;
	console.log(a)
</script>

Uncaught ReferenceError: a is not defined 

2:不可写变量

正常模式:

<script>
	undefined = 1;
	console.log(undefined)
</script>

undefined

严格模式:

<script>
	"use strict"
	undefined = 1;
	console.log(undefined)
</script>

Uncaught TypeError: Cannot assign to read only property 'undefined' of object '#<Window>'(…) 

3:删除机制

在正常模式下删除不可删除的变量或属性时并不会报错(对于删除变量会返回 false ),然而在 strict 模式下删除不可删除的变量货属性时则是不可行的,因为为报错。

正常模式:

<script>
	var a = 1;
	delete a;
</script>

true

严格模式:

<script>
	"use strict"
	var a = 1;
	delete a
</script>

Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.(…)

4: 命名的唯一性

对于 strict 模式下,函数的参数和对象内的变量都不能有重命名现象。
而在正常模式下是允许的。

正常模式:

<script>
	function test(a,a){
		return a * a;
	}
</script>

严格模式:

<script>
	"use strict"
	function test(a,a){
		return a * a;
	}
</script>

Uncaught SyntaxError: Duplicate parameter name not allowed in this context(…)

5:八进制的支持

strict 模式不支持数字的八进制表示,我们知道在正常模式下,第一位为0的数字将会认为是八进制,但是在 strict 模式不允许。

正常模式:

<script>
	var a = 01;
</script>

严格模式:

<script>
	"use strict";
	var a = 01;
</script>

Uncaught SyntaxError: Octal literals are not allowed in strict mode.(…)

6:不允许使用with

Javascript 的 strict 模式很重要的一个改变就是变量在编译阶段就已经确定,
with 语句在 strict 模式下是不被支持的,因为我们都知道 with 语句只有在运行时才能确定变量。

正常模式:

!function(){
	with({x:1}){
		console.log(x)
	}
}();

严格模式:

!function(){
	'use strict';
	with({x:1}){
		console.log(x)
	}
}();

Uncaught SyntaxError: Strict mode code may not include a with statement(…)

7:eval 函数作用域

正常模式下, eval 函数在哪个作用域下执行就属于哪个作用域,例如在全局作用域下执行则属于全局作用域,但在 strict 模式下, eval 函数拥有自己的作用域。

正常模式:

var a = 1;
eval('var a = 2');
console.log(a);

2

严格模式

"use strict";
var a = 1;
eval('var a = 2');
console.log(a);

1

strict 模式下,不可以对 eval 赋值。

"use strict";
eval = 1;

Uncaught SyntaxError: Unexpected eval or arguments in strict mode(…)

8 :arguments 对象

在 strict 模式下对函数的额 arguments 对象做了很大的限制。
首先, arguments 跟 eval 一样,不可被赋值。

"use strict";
arguments = 1;

Uncaught SyntaxError: Unexpected eval or arguments in strict mode

strict 模式不再支持 arguments.callee 的使用。

正常模式:

!function(a){
	arguments[0] = 100;
	console.log(a)
}(1)

100

严格模式:

!function(a){
	"use strict";
	arguments[0] = 100;
	console.log(a)
}(1)

1

!function(a){
	"use strict";
	arguments[0].x = 100;
	console.log(a.x)
}({x:1})

100

9:函数体内的 this

在正常模式下,我们都知道函数体内的 this 将指向全局对象,然而在 strict 模式下, this 不仅不会指向全局对象,而且在函数定义体内直接使用还会报错,只有在使用 new 创建新对象实例时才可以使用 this ,而且指向的是新的对象实例,并非全局对象。

正常模式:

var a = 1;
function foo() {
  console.log(this.a);
}
foo();

1

严格模式:

"use strict";
 var a = 1;
function foo() {
  console.log(this.a);
}
foo();

Uncaught TypeError: Cannot read property 'a' of undefined

10:函数体内访问调用栈

在 strict 模式下,函数体内不再运行访问调用栈。

正常模式:

function foo() {
  foo.callee;
  foo.caller;
  foo.arguments;
}
foo();

严格模式:

"use strict";
function foo() {
  foo.callee;
  foo.caller;
  foo.arguments;
}
foo();

Uncaught TypeError: 'caller' and 'arguments' are restricted function properties and cannot be accessed in this context.

11:函数声明的位置

在正常模式下,函数声明可以在任何位置,然后再 strict 模式下,必须在全局作用域或函数作用域的顶端声明函数。

正常模式:

var a = 1;
if(a === 1) {
  function foo() {}
}

function foo() {}

严格模式:

"use strict";
var a = 1;
if(a === 1) {
  function foo() {}
}

undefined
posted on 2016-05-04 22:52  借个火点烟  阅读(1052)  评论(0编辑  收藏  举报