1.对于es3.0和es5.0的方法,浏览器默认的执行方式是基于es3.0的方法+es5.0的新增方法。
2.为了解决es3.0和es5.0的冲突问题,可以选择在es5.0严格模式环境下进行编程,这样对于es3.0和es5.0的冲突部分,浏览器会执行es5.0。
3.ES5.0严格模式使用方法就是在所需要应用严格模式的作用域最上方输入字符串"use strict"。如果所有代码都希望应用ES5.0严格模式,则需要在所有代码逻辑的最上方输入"use strict"。
EX1 : arguments.callee不能再使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
</body>
<script>
//arguments.callee方法是es3.0的方法,在es5.0中是无效的
function test(){
"use strict";//启用es5.0严格模式
console.log(arguments.callee);
}
test();
</script>
</html>
启用严格模式后,浏览器会报如下错误:
EX2 : with不能再使用
"use strict";
var obj = {
name : "a"
}
var name = "b";
function test(){
var name = "c";
//with可以改变作用域链结构,将传入的参数放在作用域链的最顶端
with(obj){
console.log(name);
}
}
test();//a
EX4 : 变量不可以未经声明就赋值
"use strict";
a = 3;
EX5 : 使用eval( )后会为其创建新作用域
在非严格模式下,eval( )可能会影响当前作用域,例如:
eval("var a = 1");
console.log(a);//1
而在严格模式下,会为eval( )创建其自身的作用域,不会影响当前作用域,例如:
"use strict";
eval("var a = 1");
console.log(a);//a is not defined
EX6 : 不能传入函数重名参数或对象中声明重名参数,例如:
非严格模式下:
function test(name, name){
console.log(name);
}
test(1);//undefined
test(1,2);//2
var obj = {
name : "a",
name : "b"
}
console.log(obj.name);//b
严格模式下:
"use strict";
function test(name, name){
console.log(name);
}
test(1);
test(1,2);
var obj = {
name : "a",
name : "b"
}
console.log(obj.name);
将会出现错误: