es5的严格模式
ES5是ECMAScript的第五个升级版本
在原有的js中增加了
1.严格模式:使用严格模式在当前代码段的顶部添加字符串:“use strict”
use strict翻译使用严格的
严格模式的4个新要求:
1.禁止给未声明的变量赋值 在非严格模式下没有声明的变量是会自动在全局创建该变量的,在严格模式下是禁止的,严格模式必须声明变量才能使用该变量
<script>
//在顶部声明严格模式
"use strict"
//在非严格模式下,是可行的,会自动在全局创建的,但是在严格模式下是会报错的
a = 1;
console.log(a)//Uncaught ReferenceError:a is not defined
</script>
2.静默失败:在非严格模式中,执行不成功,但是不会报错.ES5对这一情况进行了改善.在严格模式下,已经将所有的静默失败都升级了错误,在这个情况下便于调试,避免歧义
3.普通函数调用和匿名函数自调中的this默认指undefined,而不再指window
<script>
//在非严格模式下
function Student(sname,sage){
this.sname = sname
this.sage = sage
}
//正确的使用构造函数
var zz = new Student('zhuzhu',11)
console.log(zz)//{sname :zhuzhu,sage:11}
//错误的使用构造函数 Student函数变成了普通函数 普通函数中的this指向window
var hbb = Student('hanbinbin',9)
console.log(hbb)//undefined
console.log(window.sname)//hanbinbin
</script>
<script>
//在严格模式下
function Student(sname,sage){
this.sname = sname
this.sage = sage
}
//正确的使用构造函数
var zz = new Student('zhuzhu',11)
console.log(zz)//{sname :zhuzhu,sage:11}
//错误的使用构造函数 Student函数变成了普通函数 普通函数中的this指向undefined
var hbb = Student('hanbinbin',9)
//报错:Uncaught TypeError: Cannot set property 'sname' of undefined
//不能 修改的 属性 sname 在 undefined中
console.log(hbb)
console.log(window.sname)
</script>
4.禁止使用arguments.callee
arguments.callee 可以自动获取当前函数对象本身,直接用当前函数对象进行递归调用,与函数名无关了
严格模式下禁用: 因为递归调用效率太低了,重复计算量太大