前面的碎碎念:最近一直跟着B站视频学习web框架,说实话看视频很容易产生我什么都会的错觉,所以打算找一些面试题来打醒自己!! 
这是一道小红书2020年的题目,咋一看题目吧,说难也不难,但是仔细说吧又说不出个啥来,在网上搜答案又感觉别人的答案不咋好。我这里是总结的《JavaScript高级程序设计》书上的说法,可以参考一下嘿嘿嘿。

JavaScript严格模式,简单地说就是可以提早知道代码中存在的错误。通过严格模式,可以进行较为严格的全局或局部的错误条件检测。主要有两种用法:第一种是在全部作用域中,此时整个脚本都开启了严格检查模式;第二种只在函数内部使用,比如:

function show(){
  "use strict"
}

下面介绍主要的不同点:

  • 变量
    第一、不允许意外创建全局变量,必须加上var关键字;
// 非严格模式下这种方式定义变量是合理的
a = 123;
// 严格模式下必须使用var关键字
var a = 123;

第二、不可以使用delete删除变量;

// 非严格模式可以使用delete删除变量
var color = 'pink';
delete color;

第三、变量名定义需谨慎!例如特殊的变量名static、public、private...不可以用!

  • 对象
    对象中的属性名必须唯一!
var Person = {
  name: '小明',
  name: '小红'
}

在非严格模式下,这种定义对象属性名的方式是可以的,这时候第二个会覆盖第一个,也就是这时候的name属性值是'小红'。而下严格模式下这种定义方法会导致语法错误!

  • 函数
    第一、要求函数中的参数名必须唯一;
function show(a,a){
    console.log(a);
  }

非严格模式下,结果和上面的类似,第二个参数值会覆盖第一个,所以输出的是传入的第二个参数值。严格模式下会报错,就老老实实的写不一样的参数名嘛,26个字母随随便便排列组合就能有一堆不一样的名字,谨慎一点。

第二、特殊的变量名不能作为函数名!
第二点和变量那里挺像的,但是正常情况下基本不会犯这样的错误的吧,就正常的起名字就好,不要去试探JavaScript的底线就好哈哈。

  • this
    我感觉这个是必须最重要的一个点,this的指向真的是一个大问题,每次都得我绕晕!!
    在非严格模式下,this指向可以通过apply()或者call()方法改变。但是在严格模式下,this始终是指向指定的值。举个例子:
var name = 'jackson';

  function showName(){
    console.log(this.name);
  }

  show.call(null);

上面这个例子,如果在非严格模式中,由于想show.call()传入了null(传入undefined结果也是一样的),所以此时函数的this指向的全局对象,在全局对象下找到了name的值并输出。而在严格模式下,这个函数的this始终指向传入的值,传null就指向null,传undefined就指向undefined,这时候肯定会产生错误了!

最后最后,严格模式还有其他的不同点,但是我感觉不咋常用(悄咪咪的说,可能我还是菜鸡没用到那种高级的方法,如果遇到了我会补上的),所以暂时就写了这么一点了。还是建议大家边学边找点题写写吧,巩固一下还是很有必要的!!