千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术干货  > 详解JavaScript严格模式

详解JavaScript严格模式

来源:千锋教育
发布人:qyf
时间: 2022-10-10 17:14:18 1665393258

详解JavaScript严格模式

  严格模式(Strict mode)是由ECMA-262规范定义的新兴JavaScript标准,发布于2009年12月第五版。旨在改善错误检查功能并且标识可能不会延续到未来JavaScript版本的脚本。ES5严格模式是限制性更强的JavaScript变体,它与常规JavaScript的语义不同,其分析更为严格。

  目前,除了IE6-9,其它浏览器均已支持ES5严格模式。

  一、严格模式的使用

  严格模式 的使用很简单,只有在代码首部加入字符串 “use strict”。有两种应用场景,一种是全局模式,一种是局部模式。

  1)全局模式

  'use strict'

  //code

  2)局部模式

  将”use strict”放到函数内的第一行,如下

  function() {

  "use strict";

  //code

  }

  二、严格模式下的执行限制

  1)不使用var声明变量严格模式中将不通过

  我们知道JS中,不使用var声明的变量默认转为全局变量。但在严格模式中将不允许,会报语法错误。

  'use strict'

  g = 100 //错误

  比如for循环

  'use strict'

  for (i=0; i<5; i++) { //错误

  console.log(i)

  }

  2)任何使用’eval’的操作都会被禁止

  'use strict'

  var obj = {}

  var eval = 3

  for (var eval in obj) {}

  function eval() {}

  function func(eval) {}

  3)eval作用域 JS中作用域有两种,全局作用域和函数作用域。严格模式带来了第三种作用域:eval作用域,如下

  'use strict'

  var a = 10

  eval('var a = 20; console.log(a)'); //20

  console.log(a) //10

  4)with被禁用

  'use strict'

  var obj = {

  name:'zhangsan',

  age:100,

  sex:'男'

  }

  with(obj) { //报错

  console.log(name);

  console.log(age);

  console.log(sex);

  }

  5)caller/callee 被禁用

  function func() {

  'use strict'

  arguments.callee

  arguments.caller

  }

  func()

  6)对禁止扩展的对象添加新属性会报错

  'use strict'

  var obj = {}

  Object.preventExtensions(obj)

  obj.a = 1 // 报错

  7)删除系统内置的属性会报错

  'use strict'

  delete Object.prototype // 报错

  delete Function.prototype // 报错

  8)delete使用var声明的变量或挂在window上的变量报错

  'use strict'

  var obj = {a:1}

  window.a = 1

  delete obj // 报错

  delete a // 报错

  9)delete不可删除属性(isSealed或isFrozen)的对象时报错

  'use strict'

  var obj = {a: 1}

  Object.seal(obj)

  delete obj.a //报错

  10)对一个对象的只读属性进行赋值将报错

  'use strict'

  var obj = {}

  Object.defineProperty(obj, 'a', {value: 1, writable: false})

  obj.a = 2 // 报错

  11)函数有重名的参数将报错

  'use strict'

  function func(a, a) {

  alert(a)

  }

  func()

  而在非严格模式中,后面的同名参数将覆盖前面的。

  12)八进制表示法被禁用

  'use strict'

  var num = 022

  13)arguments严格定义为参数,不再与形参绑定

  function func(a) {

  arguments[0] = 2

  alert(a) // 2

  }

  func(1)

  func调用时传参为1,函数内部通过arguments修改为2,此时alert的为修改后的2。 而在严格模式中则不能被修改,如下

  'use strict'

  function func(a) {

  arguments[0] = 2

  alert(a) // 1

  }

  func(1)

  14)函数必须声明在顶层

  我们知道函数声明和函数表达式是两个不同的概念。一般函数声明都在最顶层,ES5前的JS宽松,你可以写在if或for内。当然Firefox的解析方式与其他浏览器不同,见SJ9002。而在严格模式中这些写法将直接报错

  'use strict'

  if (true) {

  function func1() { } // 语法错误

  }

  for (var i = 0; i < 5; i++) {

  function func2() { } // 语法错误

  }

  15)ES5里新增的关键字不能当做变量标示符使用,如implements, interface, let, package, private, protected, public, static, yield

  'use strict'

  var let = 10 //报错

  var yield = 20

  16)call/apply的第一个参数直接传入不包装为对象

  'use strict'

  function func() {

  console.log(typeof this)

  }

  func.call('abcd') // string

  func.apply(1) // number

  依次为”string”,”number”。而在非严格模式中call/apply将对值类型的”abcd”,1包装为对象后传入,即两次输出都为”object”。

  17)call/apply的第一个参数为null/undefined时,this为null/undefined 这里以call来示例

  'use strict'

  function func() {

  console.log(this)

  }

  func.call(undefined) // undefined

  func.call(null) // null

  依次是undefined,null。而非严格模式中则是宿主对象,浏览器里是window,node.js环境则是global。

  18)bind的第一个参数为null/undefined时,this为null/undefined bind是ES5给Function.prototype新增的一个方法,它和call/apply一样在function上直接调用。它返回一个指定了上下文和参数的函数。当它的第一个参数为null/undefined时,情形和call/apply一样,this也为null/undefined。

  'use strict'

  function func() {

  console.log(this)

  }

  var f1 = func.bind(null)

  var f2 = func.bind(undefined)

  f1() // null

  f2() // undefined

  而在非严格模式中输出的都是window(或global)。

  “use strict” 的位置必须在首部。首部指其前面没有任何有效js代码。以下都是无效的,将不会触发严格模式。

  a)“use strict” 前有代码, 无效

  var width = 10

  'use strict'

  g = 100

  b)“use strict” 前有个空语句,无效

  ;//这里是空语句

  'use strict'

  g = 100

  function func() {

  ;

  'use strict'

  g = 200

  }

  function func() {

  ;'use strict'

  localVar = 200

  }

  当然,“use strict”前加注释是可以的

  // strict mode

  'use strict'

  g = 100

  function func() {

  // strict mode

  'use strict'

  g = 200

  }

  func()

tags:
声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT