严格模式

严格模式 "use strict";

通过严格模式,可以在函数内部存在的错误,及时进行较为严格的全局或局部的错误条件检测,可以提前知道代码中存在的错误,及时捕获一些可能导致编程错误的 ECMAScript 行为

 <script>
   "use strict";
 </script>

下面从以下几点说一下严格模式与标准模式的区别

  • 变量
  • 对象
  • 函数
  • eval()
  • eval与arguments
  • 抑制this
  • 其他变化

变量
1、不容许意外创建全局变量

    "use strict";
    message="hello world!";
    console.log(message);

在这里插入图片描述
2、不能对变量调用delete操作符

    "use strict";
    var message="hello world!";
    delete message;

在这里插入图片描述

//非严格模式
    var message="hello world!";
    delete message;
    console.log(message);

在这里插入图片描述
3、对变量名有限制,不能使用yield、let、package等保留字作为变量名

对象
1、为只读属性赋值会抛出错误
2、对不可配置的属性使用delete操作符会抛出错误
3、为不可扩展的对象添加属性会抛出错误

函数
1、命名函数的参数必须唯一
标准模式下:

    var b=function (value,value){
        console.log(value,value);
    }
    var c=b(2,3);
    console.log(c);

如果两个参数的名字一样的话,标准模式下返回结果为
在这里插入图片描述
标准模式下,以第二个参数为准,所以值返回为3,3,因为b(2,3)无返回值,所以c的值为undefined

    var m=function (x){
        console.log(x);
        return x;
    }
    console.log(m(2));

如果函数中有return语句,则console.log(m(2));的值就不会为undefined
严格模式下

    "use strict";
    var b=function (value,value){
        console.log(value,value);
    }
    var c=b(2,3);
    console.log(c);

结果会报错在这里插入图片描述
2、修改命名参数的值

   "use strict";
    var m=function (x){
        x=4;
        console.log(x,arguments[0]);
    }
    m(1);//4 1

严格模式下,arguments的值依然是传入的值在这里插入图片描述
而标准模式下,则会被改变在这里插入图片描述
3、在if语句声明函数,函数声明的提升问题

        var c = 1;
        console.log(a);//undefined
        if (c) {
            c--;
            function a(b) {
                return b;
            }
        }
        console.log(a(3));

标准模式下,函数会提升到if语句外部在这里插入图片描述
严格模式下,会抛出语法错误,它不会提升
在这里插入图片描述
4、严格模式下,函数名不可以为interface、let、package
5、淘汰了arguments.callee(引用函数本身)和arguments.caller(引用调用函数),在严格模式下,引用这两个属性都会抛出错误!

eval()
1、使用eval()创建变量

        (function a(){
            eval("var x=90");
            console.log(x);//标准模式下90,严格模式下报错
        })();

在这里插入图片描述
2、可以在eval()中声明变量和函数,但这些变量或函数只能在被求值得特殊作用域中有效,随后就会被销毁

        (function a(){
           var c= eval("var x=90,y=40;x*y");
            console.log(c);//3600
            console.log(x,y);//报错
        })();

在这里插入图片描述
在这里插入图片描述
eval()与arguments

        var eval=10;
        var arguments=30;
        console.log(eval,arguments);//标准模式下,10 30,严格模式下,报错
        eval=20;
        console.log(eval);//标准模式下,20

非严格模式下,可以重写eval()函数,可以给arguments赋值,
在这里插入图片描述
但在严格模式下,将会导致语法错误,不能将他们用作标识符,意味着以下几种使用方式都会抛出错误

  1. 使用var声明
  2. 赋予另一个值
  3. 尝试修改包含的值,如使用++
  4. 用作函数名
  5. 用作命名的函数参数
  6. try-catch 中用作例外名

在这里插入图片描述

抑制this

在非严格模式下使用函数的apply()call()方法,nullundefined会被替换为全局对象,而在严格模式下,this值是总是指定的值,无论指定的是什么值

//非严格模式下
        var color="red";
        var b=function (){
            console.log(this);
            console.log(this.color);
        }
        b.call(null);
        b.call(undefined);
        b();
        var c=(function (){
            color="blue";
        })();
        b.call(c);

在这里插入图片描述
严格模式下,如果是null或者undefinend,直接报错,函数的this值始终是指定的值,无论指定的是什么值
在这里插入图片描述

        "use strict";
        var color = "red";
        var b = function () {
            console.log(this.color);
        }
                var c = {
            color :"blue"
        }
        b.call(c);
        b.apply(c);

在这里插入图片描述
其它变化
1、去掉了八进制字面量,以0开头的八进制字面量已经成为无效的语法
2、不允许使用with
3、对于八进制字面量,parseInt()的行为有所改变,例如

        var e=010;
        var d=parseInt(e);
        console.log(d);//10

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值