Js中的严格和非严格模式有啥区别?

232 阅读1分钟
// "use strict"
/**
 * 选择使用: 'use strict'
 * 这里不用'use strict', 下面不会报错, 使用了'use strict'后,就会报错。
 * */
  • 变量

/**
 * 变量: 初始化没有给值的变量会报错!
 *
 * */
var a;
console.log(a)

  • 对象
/**
 * 对象: 对象中不能有重复的属性, 否则报语法错误
 * @type {{name: string}}
 */
// 严格模式下
// 重名会报语法错误!
const obj = {
    name: 'ck',
    name:'kb'
}
  • 函数
/**
 * 函数: 函数的参数, 不能重复, 不会报错, 但是通过变量名调用, 只能用到第二个参数
 *
 */

// 严格模式下, 参数不能重复, 如果不是严格模式, 不会抛出异常, 通过参数名只能访问第二个参数。
function sum(num, num) {}

  • 舍弃了eval方法: eval方法执行过程有关: 1. 先解析里面的代码, 2. 执行内部代码( 所以挺耗资源

/**
 * eval()方法
 */

  • eval、arguments
/**
 * eval和arguments: 这两个不能声明给变量名, 否则会报错, 不能作为作为变量名称!!!!
 */

const eval = 11;
const arguments = [1, 2, 3]
// 以上在非严格模式下是可以的
  • this指向
/**
 * 抑制this: 在非严格模式下, 使用函数的apply和call方法时候, null、undefined会被转成全局对象
 * 在严格模式下, this始终指向指定的对象。
 */

const color = 'red'
function  displayColor () {
    alert(this.color)
}

displayColor.call(null)

  • 其他变化

/**
 * 其他变化: 舍弃了with, 也去掉了8进制数据
 */