最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • JavaScript高级程序设计4-严格模式

    正文概述 掘金(晴天L)   2020-12-03   677

    环境

    node:v12.19.0

    chrome: 86.0.4240.193

    严格模式?

    ECMAScript5首次引入了严格模式的概念。严格模式用于选择以更严格的条件检查JavaScript代码错误,可以应用到全局,也可以运用到函数内部。

    说白了其实就是一种更严格的规则。

    开启严格模式

    function getName() {
        "use strict"
        a = "zs";//error
        return a;
    }
    getName();
    

    使用严格模式编译指示 "use strict"开启严格模式

    规则

    变量

    无法意外创建全局变量

    function setName(val) {
      "use strict"
      myName = val; // myName is not defined
      
    }
    

    无法在变量上使用delete

    • 非严格模式下静默失败(返回false)

    • 严格模式下会报错

      function setName(val) { "use strict" let myName = val; delete myName;//SyntaxError: Delete of an unqualified identifier in strict mode. } setName('zs');

    对象

    严格模式倾向于在非严格模式会静默失败的情况下抛出错误,增加了开发者提前发现错误的可能性

    对只读属性赋值抛出TypeError

    • 非严格模式下静默失败

      "use strict" let obj = {}; Object.defineProperty(obj,'key',{ writable:false, enumerable:true, configurable:true, value:'zs' }); obj.key = '123';

    在不可配置属性上使用delete会抛出TypeError

    "use strict"
    let obj = {};
    Object.defineProperty(obj,'key',{
        writable:true,
        enumerable:true,
        configurable:false,
        value:'zs'
    });
    obj.key = '123';
    delete obj.key;//Cannot delete property 'key' of #<Object>
    

    对象字面量的key必须是唯一的,不可以重复

    ECMAScript 6 删除了对重名属性的这个限制,即在严格模式下重复的对象字面量属

    性键不会抛出错误

    函数

    函数参数必须唯一

    • 非严格模式下以第二个重名参数为准,只能通过arguments访问第一个参数

    • 严格模式报错

      "use strict" function setName(val,val) { //... } setName('zd','zs');//Duplicate parameter name not allowed in this context

    关于arguments

    • 非严格模式下,修改参数的值会反映到arguments,修改arguments中的属性,也会反映到参数中

      function setName(val) { console.log(arguments[0]);//12 val = 10; console.log(arguments[0]);//10 arguments[0] = 14; console.log(val);//14 } setName('12');

    • 非严格模式下 则是相互独立的

      "use strict" function setName(val) { console.log(arguments[0]);//12 val = 10; console.log(arguments[0]);//12 arguments[0] = 14; console.log(val);//10 } setName('12');

    • 不允许操作arguments.callee和arguments.caller,否则报错

      function setName() { arguments.callee; } setName();//TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them

    ES7增加限制,在使用剩余操作符,解构操作符,默认参数时函数内部不能使用严格模式

    • 报错 Illegal 'use strict' directive in function with non-simple parameter list

      "use strict" function setName(...reset) { "use strict" console.log(reset); } setName(1,2);

    • 不报错

      "use strict" function setName() { "use strict" } setName(1,2);

    只能在脚本或函数的顶级,才能进行函数声明(测试未报错)

    "use strict"
    function setName() {
        if(true) {
            function getName() {
                
            }
        }
    }
    setName();
    

    关于eval

    JavaScript高级程序设计4-严格模式

    测试结果

    变量

    • var(非严格模式)

      function getName() { eval('var x = 2;'); console.log(x); //2 } getName();

    • let (非严格模式)

      function getName() { eval('let x = 2;'); console.log(x);//x is not defined } getName();

    • 严格模式下无论是var 还是let都会报错 x is not defined

    函数

    • 非严格模式

      function getName() { eval('function gg(){}'); console.log(gg);//未报错 } getName();

    • 严格模式

      "use strict" function getName() { eval('function gg(){}'); console.log(gg);//gg is not defined } getName();

    总结

    1.对于var、函数声明:

    非严格模式下eval里面创建的变量会加载到当前执行上下文,严格模式下eval里面创建的变量在一个新的执行上下文。

    2.对let、const

    非严格模式和严格模式都一样,只会在新的一个执行上下文。

    this强制转型

    非严格模式 普通函数调用this指向window,严格模式下指向undefined

    JavaScript高级程序设计4-严格模式

    call apply bind 显示调用和硬绑定的this默认值问题

    非严格模式下第一个参数this指向为null或undefined,则this指向globalThis,严格模式下指向传递过来的this指向

    JavaScript高级程序设计4-严格模式

    装箱问题

    非严格模式下会对传递过来的this指向进行装箱(对于number string boolean),严格模式下则不会。

    JavaScript高级程序设计4-严格模式

    类与模块

    JavaScript高级程序设计4-严格模式

    关于with

    • 非严格模式下

    JavaScript高级程序设计4-严格模式

    • 严格模式下 不能使用with

    JavaScript高级程序设计4-严格模式


    起源地下载网 » JavaScript高级程序设计4-严格模式

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元