天天看点

严格模式的不同

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)

继续阅读