在严格模式中
1. 禁止给未声明的变量赋值:
普通js中,可以给未声明的变量赋值
结果: 会自动在全局创建该变量
并且造成误会!
<script>
"use strict";
var a = "hello"
b = " world!"
console.log(a + b) //如果在严格模式下会报错
</script>
2. 静默失败升级为错误:
静默失败: 执行不成功,也不报错!
<script>
"use strict";
var eric={
eid:1001,//企业中要求员工编号不能修改
ename:"埃里克"
}
// 定义 属性
Object.defineProperty(eric,"eid",{
writable:false
// 可修改 不
})
eric.eid=1002;
console.log(eric); //如果在非严格模式下会静默失败不会报错
</script>
3. 普通函数调用/匿名函数自调中的this,不再指向window,而是undefined
<script>
"use strict";
function Student(sname, sage) {
this.sname = sname;
this.sage = sage;
}
var lilei = new Student("Li Lei", 11);
console.log(lilei);
var hmm = Student("Han meimei", 12);
//普通js中: this->window
//严格模式: this->undefined
// undefined.sname=xxx //报错:不能访问undefined的sname属性
// undefined.sage=xxx //报错:不能访问undefined的sage属性
console.log(hmm);
</script>
4. 屏蔽了arguments.callee
什么是arguments.callee: 函数内自动创建的,引用当前函数本身的关键字。
何时: 在使用递归算法时,可在函数内避免写死当前函数名。
例如:
<script>
"use strict";
function fib(num) {
if (num <= 2)
return 1
return arguments.callee(num - 2) + arguments.callee(num - 1)
}
console.log(fib(10)) //如果在严格模式下会报错
</script>