• Javascript 严格模式use strict详解


    严格模式:由ECMA-262规范定义的JavaScript标准,对javascrip的限制更强。

    (非严格的模式,被称为“马虎模式/稀松模式/懒散模式”。)


    一、严格模式的使用

    严格模式可以在脚本或函数级别实现。(即全局和局部模式)

    1.全局

    在js文件的最前面添加    "use strict"

    2.局部

    在函数内部添加   "use strict",如下

    function fn() {

        "use strict";

        //some code

    }

    二、严格模式和非严格模式的对比

    1.严格模式下,无法删除(delete)变量(delete是不合格的标识符))。非严格模式下会删除失败返回false

    "use strict";
    var x;
    delete x;//报错Delete of an unqualified identifier in strict mode.(不合格的标识符)

    2.严格模式中,函数形参存在同名的,抛出错误; 非严格模式不会

    严格模式下

    function fn(a,a){
      "use strict";
       result=a+a;
       console.log(result);
    }
    
    fn(2,4);//Duplicate parameter name not allowed in this context(重复的参数名称在此上下文中不允许)

    非严格模式下

    function fn1(a,a){
        "use strict";
        result=a+a;
        console.log(result);
    }
    fn1(2,4);//结果为8

    3.严格模式不允许八进制整数直接量(如下)。非严格模式下不会报错。

    "use strict"
    var x=089;
    console.log(x);//报错:Decimals with leading zeros are not allowed in strict mode.

    4.严格模式中,arguments对象是传入函数内实参列表的静态副本(即不再追踪参数的变化);非严格模式下,arguments对象里的元素和对应的实参是指向同一个值的引用。

    严格模式下

    fn(5);
    
    function fn(a){
        "use strict";
        a = 42;
        // return a==arguments[0];//返回false
        console.log(a);//结果为42
        console.log(arguments[0]);//结果为5,严格模式下arguments[0]表示这个调用方法的第一个参数         (不再追踪    参数的变化,在函数内部,参数a被重新赋值为42,但arguments[0]仍然为5.)
    
    }

    非严格模式下

    fn(5);
    
    function fn(a){
        a = 42;
        // return a==arguments[0];//返回true
        console.log(a);//结果为42
        console.log(arguments[0]);//结果为42(追踪参数变化)
    
    }

    5.严格模式中 eval和arguments当做关键字,它们不能被赋值和用作变量声明

    "use strict";
    var eval=3;//报错:Unexpected eval or arguments in strict mode
    var argument=6;//同样报错

    6.严格模式会限制对调用栈的检测能力,访问arguments.callee,arguments.callee.caller会抛出异常

    严格模式下:

    "use strict";
    function fn(n){
        if(n==0){
            return 1;
        }else{
            return n*arguments.callee(n-1);
        }
    }
    console.log(fn(5));//报错

    非严格模式下

    function fn(n){//阶乘
        if(n==0){
            return 1;
        }else{
            return n*arguments.callee(n-1);
        }
    }
    console.log(fn(5));//正常120

    caller:在一个函数调用另一个函数时,被调用函数会自动生成一个caller属性,指向调用它的函数对象。如果该函数当前未被调用,或并非被其他函数调用,

    则caller为null。如下:

    严格模式下:

    "use strict"
    function fn1() {
        var  n1= fn1.caller;
        console.log(n1);
    }
    function fn2() {
        fn1();
    }
    fn2();//报错

    非严格模式下:

    function fn1() {
        var  n1= fn1.caller;//此例中caller指向调用它的函数(fn2)
        console.log(n1);
    }
    function fn2() {
        fn1();
    }
    fn2();// 结果打印出:function fn2(){  fn1( )  };

    7.严格模式变量必须先声明,直接给变量赋值,不会隐式创建全局变量,不能用with。

    严格模式下

    "use strict"with(obj){
        x;
    }//报错:Strict mode code may not include a with statement

    解释:运行脚本时,首先是编译,然后再执行。显然在编译的时候,所以就不能在编译时确定with语句块中的变量到底归属哪个对象。[with语句块中的变量是(cl)的属性

    还是上一层变量作用域链中的变量。]。只能在执行时才能确定(c1)是Clothes的一个实例。这与严格模式有编译时就检查变量是否定义冲突,所以严格模式不会with语句的使用。

    扩展:with语句的使用(用来引用某个特定对象中已有的属性,但是不能用来给对象添加属性。)

    with(object instance)
    {
        //代码块
    }
    eg:function Clothes(){
        this.color="red";
        this.size="m";
        this.price="cheap";
    }
    var c1=new Clothes();
    with(c1){
        var str="颜色:"+color+",尺寸:"+size+",价格:"+price;
        document.write(str);
    }//结果(颜色:red,尺寸:m,价格:cheap)
    严格模式中 call apply传入null undefined保持原样不被转换为window
  • 相关阅读:
    第01组 Alpha冲刺 (4/4)
    第01组 Alpha冲刺 (3/4)
    发布 学习进度条 博客要求
    0302思考并回答一些问题
    13商软 《软件工程》课程设计 评分
    13商软 《软件工程》课程设计
    数独游戏的设计与实现 13商软《软件工程》补考题目
    期未总评分
    《软件工程》 团队项目展示
    20150616 最后一次冲刺
  • 原文地址:https://www.cnblogs.com/Rcyan/p/7525895.html
Copyright © 2020-2023  润新知