JavaScript 严格模式(strict mode)即在严格的条件下运行。它修复了部分语言上的不足,提供更强的错误检查,并增强安全性。
进入严格模式
1、方法中进入
function fn() {
"use strict"
console.log('干一些事情')
}
fn()
2、整个脚本使用严格模式
<script type="text/javascript">
"use strict";
console.log('做一些事情')
</script>
严格模式下的注意事项
1、变量名不能使用 "arguments" 字符串
"use strict";
var arguments = '2' // 报错 Uncaught SyntaxError: Unexpected eval or arguments in strict mode
2、不允许使用八进制
"use strict";
var num = 010 // 报错 Uncaught SyntaxError: Octal literals are not allowed in strict mode.
3、不允许变量重名
"use strict";
function sum(a,a) { // 报错 Uncaught SyntaxError: Duplicate parameter name not allowed in this context
return a+a
}
console.log(sum(2,3))
4、不允许未声明的变量被赋值
"use strict";
a = 5 // 报错 Uncaught ReferenceError: a is not defined
5、不允许删除变量或对象
"use strict";
var a = 5
delete a
console.log(a) // 报错 Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.
6、不允许删除函数
"use strict";
function add(a,b) {
return a+b
}
delete add // 报错 Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.
console.log(add(2,4))
7、不允许使用转义字符
"use strict";
var x = \010; // 报错 Uncaught SyntaxError: Invalid or unexpected token
8、不允许对只读属性赋值
"use strict";
var obj = {}
Object.defineProperty(obj,'name',{
value: '张三',
writable: false
})
obj.name = '李四' // 报错 Uncaught TypeError: Cannot assign to read only property 'name' of object '#<Object>'
9、不允许对一个使用getter方法读取的属性进行赋值
"use strict";
var obj = { get x() { return 100 } };
obj.x = 66; // Uncaught TypeError: Cannot set property x of #<Object> which has only a getter
10、变量名不能使用 "eval" 字符串
"use strict";
var eval = '哈喽' // 报错 Uncaught SyntaxError: Unexpected eval or arguments in strict mode
11、不允许删除一个不允许删除的属性
"use strict";
delete Array.prototype // 报错 Uncaught TypeError: Cannot delete property 'prototype' of function Array() { [native code] }
12、由于一些安全原因,在作用域 eval() 创建的变量不能被调用
"use strict";
eval("var a = 2");
alert(a); // 报错 Uncaught ReferenceError: a is not defined
13、严格模式下,arguments对象在使用中是不可以进行修改的,修改arguments对象不会影响到实际的函数参数
'use strict'
function add2(a, b) {
arguments[0] = 50
arguments[1] = 100
console.log(a + b) // 8
}
add2(3, 5)
14、禁止this关键字指向全局对象
function f() {
return !this;
}
// 返回false,因为"this"指向全局对象,"!this"就是false
function f() {
"use strict";
return !this;
}
// 返回true,因为严格模式下,this的值为undefined,所以"!this"为true。
function fn(name) {
'use strict';
this.name = name
}
fn('张三')
// 报错 Uncaught TypeError: Cannot set property 'name' of undefined
// 如果函数内使用了this,则在使用函数的时候必须new,否则this没有被初始化
15、禁用with
"use strict";
var obj = {
a: 1,
b: 2,
c: 3
}
with (obj) {
a = 100;
b = 101;
c = 102
}
console.log(obj)
// 报错 Uncaught SyntaxError: Strict mode code may not include a with statement