1、严格模式开启:
整个脚本在严格模式下执行:在<script></script>标签内上方写上"use strict"
某个函数在严格模式下执行:在函数内部顶端写上"use strict"
2、简化变量使用
禁止使用with;
eval不再为上层引入新变量,但仍能访问上层资源,修改上层资源;
不能删除声明的变量;
3、拼写错误转为异常
意外创建全局变量(不适用var let声明变量);
静默失败(如对不能写的属性修改值,冻结的对象操作等);
删除不能删除的属性 delete Object.prototype;
对象属性不能重名:{a:10, a:8};
函数参数名唯一:function m(a, a, c){};
禁止使用八进制数字语法:0654,es6支持0o前缀表示八进制;
禁止给原始值设置属性:"name".you = 'he';
4、eval/arguments简单化
简单来说 eval和arguments不能当做变量进行操作 例如eval=10;arguments++;不能当做函数名、变量名等;
参数值不随arguments的值变化而变化;
禁用arguments.callee、arguments.caller,不能为函数.caller属性赋值;非严格模式arguments.caller=undefined,函数.caller指向调用当前函数的函数,若在全局为null,arguments.callee指向当前函数
5、安全的js
如果没有指定this ,那么this的值为undefined,全局环境,this为window,直接调用的函数内有this,标准为window,严格模式为undefined;
通过this传递给函数的值不会被强制转换为对象(使用call/apply/bind);
fun.caller/fun.arguments都不能删除、不能存值取值;
6、总结
eval 和 arguments 不能作为变量被赋值,不能作为函数名,参数名,函数的参数不能有同名属性,否则报错;
变量必须声明后再使用,否则会报错,ReferenceError错误;
不能使用with语句;
不能对只读属性赋值,否则报错;
不能使用前缀0表示八进制数,否则报错;
不能删除不可删除的属性,否则报错;
不能删除变量delete prop,会报错,只能删除属性delete global[prop];
eval不会在它的外层作用域引入变量,即内部变量不能在外部调用;
arguments不会自动反映函数参数的变化,重写arguments的值报错:arguments = [5];
禁用arguments.callee、arguments.caller;
禁止this指向全局对象;
不能使用fn.caller和fn.arguments获取函数调用的堆栈;
增加了保留字(比如protected、static和interface)