关于严格模式的具体分析

1、什么是ES5

  • 概念:
    • ES5指的是:ECMAScript 5,它是JavaScript语言的国际标准。
    • ES5通过对现有JavaScript方法添加语句和原生ECMAScript对象做合并实现标准化
    • 还引入了一个语法的严格变种,被称为“严格模式”

2、如何开启严格模式

  1. 写法:
    • "use strict"
  2. 解释:
    • 只要将"use strict"这个字符串放在代码的前方,后面的代码就会按照严格模式进行解释
  3. 开启类型:
    • 局部开启:让函数内部的代码遵循严格模式,主要是为了避免不规范的代码
    • 全局开启:让所有代码都遵循严格模式
  4. 参数严格
    • 严格就是只要出现错误,就不姑息—会直接报错
    • 报错会让代码写的更严谨,能更及时的排查代码中的隐患
// 1、常规写法 => 现实中几乎不会出现这样的错误 
              function poo(){
                 function a( b , b , c ){  // 这里写了两个同名的参数 => 参数错误,在非严格模式下,是可以允许的
                 console.log( b , c );     // 打印b的结果为2,会理解成1赋值给b一次,在把2赋给它一次,3是正常赋值给c的
              }
                 a( 1 , 2 , 3);
              } 
                poo(); 

// 2、局部严格模式
              function foo(){
                 "use strict" // 开启严格模式 => 后续的代码都会按照严格模式进行解释
                  function a( b , b , c ){
                     console.log( b , c ); // 严格模式下 => 会直接报错,显示有同名参数
                  }
                  a( 1 , 2 , 3);
              }  
                foo();
  1. arguments关键字
    • 函数中使用的关键字,这个关键字可以:获取多个参数,并且还可以访问当前函数本身
    • arguments关键字可以在没有形参的情况下,获取到实参的内容
解释:
// 1、console.log( arguments )时得到的结果是一个伪数组
// 2、为数组中的callee代表着当前函数本身,可以通过arguments.callee直接调用本身
// 3、之前在递归中需要函数调用自己,但是使用arguments关键字,可以写成 => console.log( arguments.callee ) 通过打印可得当前的foo函数
// 4、arguments.callee 可以代表当前函数本身  => 一般会应用在匿名函数中,但如果在匿名函数中还调用自身的话,就不太可取了
// 5、arguments.callee 在严格模式中被禁用了
// 6、arguments可以不用形参,获取到所有传递过来的实参 => 用来处理不确定传递多少实参的情况下,有一定的作用 
function foo(){
    "use strict"
  // console.log( arguments.callee ); ==> 严格模式下,是被禁用的功能   
     for(var i = 0 ; i < arguments.length ; i ++){ // 可以遍历arguments,获取所有传入的实参
          console.log( arguments[i] );
     }
}
foo( 1 , 2, 3, 4, 5, 6, 6666,4444,3333,222,1111 );

3、严格模式中对this指向的严格

  1. 解释
    • this关键字描述的是函数的调用者
    • 函数调用时才能确定调用者是谁,函数是在哪里取出(.)的,那么这个函数的调用者就是谁,
    • 函数的调用者是在函数调用时决定
  2. 注意
    • this指向window对象毫无作用
  3. 补充
    • 如果this指向了window—那么就会让this变为undefined,因为undefined不能使用取出运算,所以在进行取出运算的时候会报错
  4. 三种示例this的指向结果
       "use strict" // 全局开启严格模式
// 1、普通函数的this指向
        function foo(){
            console.log( this ); // 打印得到指向了window
        }
        foo(); // 如果函数被直接调用,此时函数的调用者就是 => window,window.foo(); = foo();
     
// 2、对象内部的this指向
        var obj = {
            fn : function(){ // 这里的fn是key值 function是value值
                console.log( this ); // this指向就是它的调用者,此时打印结果为obj
            }
        }
        obj.fn(); // 取出obj中的fn => 此时的调用者就是obj

// 3、变量中的this指向
        var fn = obj.fn; // 把函数地址赋值给了fn变量
        fn(); // 此时的this指向是window

你可能感兴趣的:(前端基础,javascript,开发语言,ecmascript,前端,html,改行学it,学习方法)