1、必须用var关键字初始化变量
2、不能使用with关键字(1、with效率低下 2、可能导致内存泄露)
3、严格模式写会出现会出现除了全局作用域和局部作用域之外的第三种作用域eval作用域
4、为了安全,全面禁止this关键字指向全局window对象
5、为了安全,禁止函数内部调用栈
6、为了安全,禁止删除变量,对象的成员变量可以删除
7、普通模式写对一个对象的只读属性赋值,不会成功,但是也不会报错,在严格模式下会直接报错
8、严格模式下,对禁止扩展的对象添加属性,会报错
9、严格模式下,重名属性报语法错误
10、严格模式下,重名参数报语法错误
11、禁止八进制的使用(数字不能以0开头)
12、对arguments进行了严格的限制
* 1、arguments不能被赋值
* 2、arguments不对元素进行追踪
* 3、无法使用arguments.callee递归调用
13、函数必须声明在顶层,将来js将引入块级作用域(不允许在非函数代码块中声明函数)
* 1、arguments不能被赋值
14、严格模式下,一些新增了一些保留关键字,implements,interface,let,package,private,protected,public,static,yield
* 不准许使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>js的严格模式</title>
<script>
/*******************************************************************************/
/*
* 1、必须用var关键字初始化变量
* */
//非严格模式
// i=1;
// alert(i);//执行成功
// "use strict"
//严格模式
//i=1;
// alert(i);//i is not defined
/*******************************************************************************/
/*2、不能使用with关键字(1、with效率低下 2、可能导致内存泄露)*/
//2.1内存泄露的实例
// function foo(obj) {
// with (obj) {//Uncaught SyntaxError: Strict mode code may not include a with statement
// a = 2;
// }
// }
//
// var o1 = {
// a: 3
// };
//
// var o2 = {
// b: 3
// }
//
// foo(o1);
// console.log(o1.a); //2
//
// foo(o2);
// console.log(o2.a); //underfined
// console.log(a); //不好,a被泄漏到全局作用域上了
//2.2性能降低
/*
* 原因是 JavaScript 引擎会在编译阶段进行数项的性能优化 出现了 with 部分完全不做任何优化
*
* */
/*******************************************************************************/
/*3、eval关键字
* 1、严格模式写会出现会出现除了全局作用域和局部作用域之外的第三种作用域eval作用域
* 2、
*
* */
//非严格模式
// eval("var x=100; alert(x)");//弹出100
// alert(x);//弹出100
//
// //严格模式
// "use strict"
// eval("var x=100;alert(x)")//100
// alert(x);//x is not defined
/*******************************************************************************/
/**
* 4、为了安全,全面禁止this关键字指向全局window对象
*/
//非严格模式
// var abc= function () {
// console.log(this);//Windows对象
// }
// abc();
//严格模式
// "use strict"
// var abc=function () {
// console.log(this);
// }
// abc();//undefined
// //一般用构造方法给对象的属性赋值会报错
// var dog= function (name) {
// this.name=name;
// this.say=function () {
// alert("啊呜啊呜!")
// };
// }
// obj("旺财");
/*******************************************************************************/
/**
* 5、为了安全,禁止函数内部调用栈
*/
// var fn=function () {
// //'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them
// alert(fn.arguments.length);
// }
// fn();
/*******************************************************************************/
/**
* 6、为了安全,禁止删除变量,对象的成员变量可以删除
*/
//非严格模式
// var x=100;
// delete x;
// alert(x=100);//弹出100 删除无效 但是不报错
// var obj={};
// obj.x=100;
// delete obj.x;
// alert(obj.x);//undefined 删除成功
//严格模式
// "use strict"
// var x=100;
// delete x;
// alert(x=100);//Delete of an unqualified identifier in strict mode.直接报错
// var obj={};
// obj.x=100;
// delete obj.x;
// alert(obj.x);//undefined 删除成功
/**
* 7、普通模式写对一个对象的只读属性赋值,不会成功,但是也不会报错,在严格模式下会直接报错
*/
/**
* 8、严格模式下,对禁止扩展的对象添加属性,会报错
*/
//普通模式
// var obj={};
// obj.x=100;
// Object.preventExtensions(obj);
// obj.y=200;
// console.log(obj);//不报错 不修改
//严格模式
// "use strict"
// var obj={};
// obj.x=100;
// Object.preventExtensions(obj);
// obj.y=200;
// console.log(obj);//Cannot add property y, object is not extensible 报错
/**
* 9、严格模式下,重名属性报语法错误
*/
//普通模式
// var obj9={
// x:100,
// x:200
// }
// console.log(obj9);//属性覆盖,不报错
//严格模式
// "use strict"
// var obj9={
// x:100,
// x:200
// }
// console.log(obj9);//直接报错
/**
* 10、严格模式下,重名参数报语法错误
*/
//普通模式
// var obj10=function (x,x,y) {
// console.log(arguments[0]);
// console.log(arguments[1]);
// console.log(arguments[2]);
// }
// obj10(1,1,2);//1 1 2
//严格模式
// "use strict"
// var obj10=function (x,x,y) {
// console.log(arguments[0]);
// console.log(arguments[1]);
// console.log(arguments[2]);
// }
// obj10(1,1,2);//1 1 2//Duplicate parameter name not allowed in this context
/**
* 11、禁止八进制的使用(数字不能以0开头)
*/
//普通模式
// var i=0111;
// console.log(i);//73
//严格模式
// "use strict"
// var i=011;
// console.log(i);//Octal literals are not allowed in strict mode.
/**
* 12、对arguments进行了严格的限制
* 1、arguments不能被赋值
* 2、arguments不对元素进行追踪
* 3、无法使用arguments.callee递归调用
*/
//普通模式
// var obj=function () {
// arguments=100;
// };
// obj();//不报错
// var fn=function (num) {
// num+=num;
// alert(num);//200
// alert(arguments[0]);//200
// };
// fn(100);
// var num=0;
// //匿名函数
// (
// function (num) {
// num++;
// if (num<=5)
// {
// alert(num);
// //递归调用
// arguments.callee(num);
// }
// }
// )(num);
//严格模式
// "use strict"
// var obj=function () {
// arguments=100;
// };
// obj();//报错
// var fn=function (num) {
// num+=num;
// alert(num);//200
// alert(arguments[0]);//100
// };
// fn(100);
// var num=0;
// //匿名函数
// (
// function (num) {
// num++;
// if (num<=5)
// {
// alert(num);
// //递归调用
// arguments.callee(num);//报错
// }
// }
// )(num);
/**
* 13、函数必须声明在顶层,将来js将引入块级作用域(不允许在非函数代码块中声明函数)
* 1、arguments不能被赋值
*/
//普通模式
// var i=1;
// if (i>0){
// function fn() {
// console.log("非严格模式可以在此");
// }
// (function () {
// console.log("匿名,非严格模式可以在此")
// })()
//
// }
// fn();
//严格模式
// "use strict"
// var i=1;
// if (i>0){
function fn() {
console.log("严格模式 不可以在此");//fn is not a function
}
// (function () {
// console.log("匿名,严格也模式可以在此")
// })()
// }
// //fn();
/**
* 14、严格模式下,一些新增了一些保留关键字,implements,interface,let,package,private,protected,public,static,yield
* 不准许使用
*/
</script>
</head>
<body>
</body>
</html>