开发中的严格模式

作者: LIT乐言 | 来源:发表于2019-07-20 17:55 被阅读0次

    js中有严格模式和非严格模式两种运行环境

    • 在开发中,有非严格模式和严格模式2种开发模式

    • 在严格模式下,会做更加严格的语法检查,以前在非严格模式下可以使用的一些语句,在严格模式下直接报错或者抛出异常

    • 开启严格模式 : "use strict";

    • 如果浏览器支持严格模式就会开启严格模式,如果不支持,'use strict'作为一段字符串忽略处理

    实现严格模式:只需要在脚本代码中添加上上述关键字即可。 关键字具体说明

    • (1) 注意区分大小写,必须全部都是小写的
    • (2) 注意空格,整个字符串总共10个字符
    • (3) 单引号和双引号无所谓,但是需要有双引号
    • (4) 必须写在作用域的最顶部,注意其位置
    • (5) 可以加分号,也可以不加,但是必须是一个字符串
    
          //"use strict";   //正确写法
    
          //"use strict"    //正确写法     分号可以省略
    
           //'use strict';   //正确写法     可以使用单引号
          //"use  strict";    //错误写法   必须是10个字符
          //"use Strict";     //错误写法   所有的字符都必须小写
    
    **作用范围**
    
    ① 函数的顶部(只对当前的函数有效)
    
    ② script标签的顶部,只对当前的标签有效,对页面中其他的script无效
    
    代码示例
    
    
        //位置01       对func01和func02都有效
        //"use strict";
    
        function func01() {
            //位置02   对func01有效,对func02无效
            //"use strict";
            a = 10;
            console.log(a);
        }
    
        function func02() {
            //位置03 对func02有效,但对func01无效
           //"use strict";
            b = 20;
            console.log(b);
        }
    
        func01();
        func02();
    
    
    # 严格模式使用注意
    
    **常见的几种**
    
    * ① 所有的变量必须使用var 关键字声明
    * ② 不能使用delete关键字删除全局变量 ,以前默认删除失败,严格模式下直接报错
    * ③ 在对象中不允许有同名的属性
    * ④ 函数的参数必须唯一(不能出现同名的参数)
    * ⑤ arguments对象的行为不同,在非严格模式下修改形参的值会反映到arguments中,而严格模式下则相对独立
    * ⑥ 禁用了argument.callee和caller函数,他们一个引用函数本身,一个引用调用函数
    * ⑦ 不能在if语句中声明函数
    * ⑧ 禁止使用eval和arguments作为标识符
    * ⑨ 修正this的值,在严格模式下,函数this的值始终是指定的值,无论指定的是什么值。
    * 10 禁用了with语句
    * 11 去掉了JavaScript中的八进制字面量(以0开头的八进制字面量是无效的语法)
    

    ① 所有的变量都必须使用var关键字声明

     a = 10;             //错误的演示
     console.log(10);
    

    ② 不能使用delete关键字删除全局变量

    //在非严格模式下,删除失败(静默失败)   严格模式下直接报错
    var a = 10;
    delete a;
    console.log(a);
    

    ③ 在对象中不允许有同名的属性

    //在非严格模式下,会使用后面的属性赋值作为最终值,在严格模式下则直接报错
    var obj = {
        name:"张三",
        name:"李四"
    }
    
    console.log(obj);
    

    ④ 函数的参数必须唯一(不能出现同名的参数)

    //在非严格模式下,如果函数在定义的时候,使用了多个同名的参数,则在函数内部形参的实际值为最后一个传入的实参值
    //在严格模式下,直接报错
    //    function func(a,a,a) {
    //        console.log(a);
    //        console.log(arguments);
    //    }
    
    function func(a,b,c) {
        console.log(a);
        console.log(arguments);
    }
    func(1,2,3);
    

    arguments对象的行为不同

    说明:

    (1)严格模式下,在函数内部修改了对象的指向,对arguments的值不会产生影响

    (2)在严格模式下,形参的值和arguments的值是相互独立的,在函数内部修改了形参的值对arguments不受影响

    (3)在非严格模式下,修改了形参的值,arguments中的数据会跟着改变

    //测试引用类型的值作为函数的参数
      function funcName(obj) {
        console.log(obj);
        console.log(arguments[0]);
    
        //在函数内部修改形参的值
        obj = {age:20};
        console.log(obj);
        console.log(arguments[0]);
    }
    
    funcName({name:"张三"});
    //测试基本类型数据作为函数的参数
    function fun(str) {
        console.log(str);
        console.log(arguments[0]);
        str = "hello";
        console.log(arguments[0]);
    }
    
    fun("hi");
    
    **⑥ 禁用了argument.callee和caller函数**
    
    说明:
    
    * argument.callee是对函数自身的引用
    * argument.calller是对调用函数的引用
    
    
            var num = (function (n) {
                if (n ==1)
                {
                    return 1;
                }
    
                return arguments.callee(n-1) + n;
            })(10);
    
            console.log(num);       
    
    **⑦ 不能在if语句中声明函数**
    
    
    * 如果在if语句中声明函数,则会产生语法错误
    
      
             if (true)
            {
            console.log("________");
            function demo() {
                console.log("呵呵呵呵");
            }
    
            demo();
            }
    
    
    **⑧ 禁止使用eval和argument作为标识符**
    
    
        var eval = "测试的字符串";
        console.log(eval);
    
        var arguments = "参数列表";
        console.log(arguments);
    
    
    **⑨ 修正this的值**
    
     * 在严格模式下,函数this的值始终是指定的值,无论指定的是什么值
        
            var name = "测试的name";
            function demoTest() {
    
            //在非严格模式下,打印出来的this为全局的对象window
            console.log(this);  //在严格模式下打印出来的this为undefined
              }
    
            demoTest();
    
    
    **⑩ 禁用了with语句**
    
        var o = {name:"小狐狸",age:20};
        with(o)
        {
            name = "lisi";
            age = 48
        }
        console.log(o);
    
    

    相关文章

      网友评论

        本文标题:开发中的严格模式

        本文链接:https://www.haomeiwen.com/subject/hbcgbxtx.html