91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

javascript嚴格模式詳解(含嚴格模式與非嚴格模式的區別)

發布時間:2020-09-03 11:22:50 來源:腳本之家 閱讀:176 作者:jm365 欄目:web開發

嚴格模式的優缺點

優點:

  1. 提高代碼解析與運行速度
  2. 禁用一些不合理的語法,減少代碼的怪異行為

缺點

  1. 某些代碼在嚴格模式下會報錯,尤其引入公用與第三方模塊的時候需要注意
  2. 有些嚴格模式的特性在不同瀏覽器的支持情況不同,需要注意兼容問題

嚴格模式與非嚴格模式的區別

1.禁用with語法,使用將報錯

因為解析with語法時作用域的情況會非常復雜,嚴重影響代碼的解析與運行速度

function usualMode() {
  with({a: 1}) {
    console.log(a)
  }
}
usalMode() // 正常輸出 1

function strictMode() {
  'use strict'
  with({a: 1}) {
    console.log(a)
  }
}
strictMode() // 將報錯

2.禁止刪除變量與函數

function usualMode() {
  function fn() {} 
  var a = 1
  delete a // 不會報錯,但實際上也沒能刪除變量a
  delete fn // 同delete a
}
usalMode() // 正常執行

function strictMode() {
  'use strict'
  function fn() {} 
  var a = 1
  delete a
}
strictMode() // 將報錯

3.屬性描述符(propertyDescriptor)相關

能改變屬性描述符的方法有Object.defineProperty、Object.defineProperties、Reflect.defineProperty、Reflect.defineProperties、Object.freeze、Object.seal;獲取一個屬性描述符可以用Object.getOwnPropertyDescriptor、Object.getOwnPropertyDecriptors,ES6中還有Reflect.getOwnPropertyDescriptor、Reflect.getOwnPropertyDescriptors

3.1刪除configurable = false的屬性會報錯

'use strict'
var obj = {}
Object.defineProperty(obj, 'a', {
  configurable: false,
  value: 1
})
delete obj.a // 嚴格模式會報錯;非嚴格模式會返回false

3.2給writable = false的屬性賦值會報錯

'use strict'
var obj = {}
Object.defineProperty(obj, 'a', {
  writable: false,
  value: 1
})
obj.a = 2 // 嚴格模式會報錯;非嚴格模式不會報錯,但也不會生效,obj.a 仍然等于 1

4.給不允許擴展的object增加屬性會報錯

'use strict'
var obj = {a: 1}
Object.preventExtensions(obj)
obj.b = 2 // 嚴格模式下會報錯;非嚴格模式不會報錯,但也不會生效 'b' in obj 為false

能將object設置為不可擴展的方法有Object.freeze、Object.seal、Object.preventExtensions;ES6還有Reflect.freeze、Reflect.seal、Reflect.preventExtensions;判斷一個object是否允許擴展可以用Object.isExtensible;ES6還有Reflect.isExtensible

5.給未申明的變量賦值會報錯

'use strict'
a = 1 // 嚴格模式下將報錯,非嚴格模式a變量會提升至全局作用域

6.定義object時屬性重名會報錯

'use strict'
var obj = {a: 1, a: 2}// 嚴格模式將報錯;非嚴格模式后面一個a會覆蓋前面的a,即obj.a = 2

7.形參重復時會報錯

'use strict'
function fn(a, a) {
  console.log(a, arguments)
}
fn(1,2) // 嚴格模式會報錯;非嚴格模式不會報錯,a=2,arguments中兩個參數都有

8.eval相關

8.1eval有獨立作用域

'use strict'
eval('var a = 1')
console.log(typeof a) // 嚴格模式下為undefined;非嚴格模式下為number

8.2eval不能作為變量名或函數名,類似關鍵字

'use strict'
var eval = 1 // 嚴格模式下將報錯;非嚴格模式將申明一個值為1的變量eval

// 嚴格模式下將報錯;非嚴格模式將申明一個對應的eval函數
function eval() {
// some code
}

9.arguments相關

9.1arguments是形參的副本(類似淺拷貝)

'use strict'
function fn(a, obj){
  arguments[0] = 2
  arguments[1].b = 2
  console.log(a) // 嚴格模式為1;非嚴格模式為2
  console.log(obj.b) // 2,因為js中object是地址傳遞
}
fn(1, {b: 1})

9.2arguments不能作為變量名或函數名,類似關鍵字

'use strict'
var arguments = 1 // 嚴格模式下將報錯;非嚴格模式將申明一個值為1的變量arguments

// 嚴格模式下將報錯;非嚴格模式將申明一個對應的arguments函數
function arguments() {
  // some code
}

10.禁用caller與callee

'use strict'
function fn() {
  console.log(arguments.callee.caller, fn.caller) // 嚴格模式下報錯;非嚴格模式指向fn2
  console.log(arguments.callee) // 嚴格模式報錯;非嚴格模式指向fn
}
function fn2() {
  fn()
}
fn2()

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

榆树市| 西充县| 娄底市| 班戈县| 徐水县| 靖宇县| 五大连池市| 大港区| 绥中县| 留坝县| 唐河县| 梅河口市| 建德市| 浦城县| 淄博市| 呼图壁县| 田阳县| 闸北区| 惠东县| 大洼县| 湖南省| 恭城| 饶河县| 五原县| 张家界市| 黄大仙区| 昌江| 大港区| 屏南县| 海阳市| 清丰县| 子洲县| 武冈市| 拉萨市| 双桥区| 南平市| 沛县| 唐海县| 平顺县| 从江县| 会泽县|