• JS在严格模式和非严格模式的区别


    若想在严格模式下使用JS,需要在文件的第一行加上“use strict”,在实际开发中,常常将“use strict”加入到闭包的内部

    具体是:

    • 整个脚本中使用:在这个JavaScript文件开头写'use strict'; 在闭包内部中使用 funtion () { 'use strict'; }
    • 严格模式下,不允许使用with
    with语句 扩展一个语句的作用域链。
    with (expression) {
        statement
    }
    • 严格模式下,不允许给未声明的变量赋值
    • 严格模式下,arguments与参数不存在映射关系
    function(h) {
        arguments[0] = 100;
        console.log(h);  //100
    }(1);
    
    function(h) {
        'use strict';
        arguments[0] = 100;
        console.log(h);  //1
    }(1);
    但是,但参数是对象时,是存在映射关系的:
    function(h) {
        'use strict';
    console.log(h.a);//1 arguments[0].a = 100; console.log(h.a); //100 }({a:1});
    • 严格模式下,删除参数名,函数名报错。非严格模式返回false,不报错也没有任何效果
    function(h) {
        console.log(h);  //1
        console.log(delete h);  //false
        console.log(a);  //1
    }(1);
    
    function(h) {
        'use strict';
        console.log(h);  //1
        delete h;  //SyntaxError(语法错误)
        console.log(h);  //1
    }(1)
    • 严格模式下,函数参数名重复报错。非严格模式最后一个重名参数会覆盖之前的重名参数。
    function (a, a, b) {
        console.log(a + b);  //5
    }(1, 2, 3);
    
    !function (a, a, b) {
        'use strict';
        console.log(a + b);  //SyntaxError
    }(1, 2, 3);
    • 严格模式下,删除不可配置(configurable=false)的属性报错。非严格模式返回false,不报错也没有任何效果
    function (a){
        var obj={};
        Object.defineProperty(obj,'a',{ configurable: false });
        console.log(delete obj.a); //flase
    }(1);  
            
    !function (a){
        'use strict';
        var obj={};
        Object.defineProperty(obj, 'a', { configurable: false });
        console.log(delete obj.a); //TypeError
    }(1);
    • 严格模式下,修改不可写(writable=false)的属性报错
    unction () {
        var obj = { a: 1 };
        Object.defineProperty(obj, 'a', { writable: false });
        obj.a = 2;
        console.log(obj.a);  //1  //证明没有被修改
    }();
    
    !function () {
        'use strict';
        var obj = { a: 1 };
        Object.defineProperty(obj, 'a', {writable: false});
        obj.a = 2;  //TypeError
    }();
    • 严格模式下,一般函数调用,this指向undefined,而不是全局对象
    function () {
        function fun() { return this; }
        console.log( fun() );  //Window
    }();
    
    !function () {
        'use strict';
        function fun() { return this; }
        console.log( fun() );  //undefined
    }();
    • 严格模式下,不再支持arguments.callee/caller
  • 相关阅读:
    虚拟机安装 ubuntu 后,更新源无效,以及无法联网安装软件的问题
    使用IE滤镜实现css3中rgba让背景色透明的效果
    C# 代理应用
    通过 DynamicLinq 简单实现 N-Tier 部署下的服务端数据库通用分页
    ICMP:internet 控制报文协议
    多模板支持
    C#与Java对比学习:数据类型、集合类、栈与队列、迭达、可变参数、枚举
    IOS中KVO模式的解析与应用
    ASP.NET MVC实现仪表程序
    spring和redis的整合
  • 原文地址:https://www.cnblogs.com/yuan233/p/10300887.html
Copyright © 2020-2023  润新知