真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

javascript嚴(yán)格模式詳解(含嚴(yán)格模式與非嚴(yán)格模式的區(qū)別)

嚴(yán)格模式的優(yōu)缺點(diǎn)

創(chuàng)新互聯(lián)是一家企業(yè)級(jí)云計(jì)算解決方案提供商,超15年IDC數(shù)據(jù)中心運(yùn)營經(jīng)驗(yàn)。主營GPU顯卡服務(wù)器,站群服務(wù)器,四川主機(jī)托管,海外高防服務(wù)器,大帶寬服務(wù)器,動(dòng)態(tài)撥號(hào)VPS,海外云手機(jī),海外云服務(wù)器,海外服務(wù)器租用托管等。

優(yōu)點(diǎn):

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

缺點(diǎn)

  1. 某些代碼在嚴(yán)格模式下會(huì)報(bào)錯(cuò),尤其引入公用與第三方模塊的時(shí)候需要注意
  2. 有些嚴(yán)格模式的特性在不同瀏覽器的支持情況不同,需要注意兼容問題

嚴(yán)格模式與非嚴(yán)格模式的區(qū)別

1.禁用with語法,使用將報(bào)錯(cuò)

因?yàn)榻馕鰓ith語法時(shí)作用域的情況會(huì)非常復(fù)雜,嚴(yán)重影響代碼的解析與運(yùn)行速度

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

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

2.禁止刪除變量與函數(shù)

function usualMode() {
  function fn() {} 
  var a = 1
  delete a // 不會(huì)報(bào)錯(cuò),但實(shí)際上也沒能刪除變量a
  delete fn // 同delete a
}
usalMode() // 正常執(zhí)行

function strictMode() {
  'use strict'
  function fn() {} 
  var a = 1
  delete a
}
strictMode() // 將報(bào)錯(cuò)

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

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

3.1刪除configurable = false的屬性會(huì)報(bào)錯(cuò)

'use strict'
var obj = {}
Object.defineProperty(obj, 'a', {
  configurable: false,
  value: 1
})
delete obj.a // 嚴(yán)格模式會(huì)報(bào)錯(cuò);非嚴(yán)格模式會(huì)返回false

3.2給writable = false的屬性賦值會(huì)報(bào)錯(cuò)

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

4.給不允許擴(kuò)展的object增加屬性會(huì)報(bào)錯(cuò)

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

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

5.給未申明的變量賦值會(huì)報(bào)錯(cuò)

'use strict'
a = 1 // 嚴(yán)格模式下將報(bào)錯(cuò),非嚴(yán)格模式a變量會(huì)提升至全局作用域

6.定義object時(shí)屬性重名會(huì)報(bào)錯(cuò)

'use strict'
var obj = {a: 1, a: 2}// 嚴(yán)格模式將報(bào)錯(cuò);非嚴(yán)格模式后面一個(gè)a會(huì)覆蓋前面的a,即obj.a = 2

7.形參重復(fù)時(shí)會(huì)報(bào)錯(cuò)

'use strict'
function fn(a, a) {
  console.log(a, arguments)
}
fn(1,2) // 嚴(yán)格模式會(huì)報(bào)錯(cuò);非嚴(yán)格模式不會(huì)報(bào)錯(cuò),a=2,arguments中兩個(gè)參數(shù)都有

8.eval相關(guān)

8.1eval有獨(dú)立作用域

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

8.2eval不能作為變量名或函數(shù)名,類似關(guān)鍵字

'use strict'
var eval = 1 // 嚴(yán)格模式下將報(bào)錯(cuò);非嚴(yán)格模式將申明一個(gè)值為1的變量eval

// 嚴(yán)格模式下將報(bào)錯(cuò);非嚴(yán)格模式將申明一個(gè)對(duì)應(yīng)的eval函數(shù)
function eval() {
// some code
}

9.arguments相關(guān)

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

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

9.2arguments不能作為變量名或函數(shù)名,類似關(guān)鍵字

'use strict'
var arguments = 1 // 嚴(yán)格模式下將報(bào)錯(cuò);非嚴(yán)格模式將申明一個(gè)值為1的變量arguments

// 嚴(yán)格模式下將報(bào)錯(cuò);非嚴(yán)格模式將申明一個(gè)對(duì)應(yīng)的arguments函數(shù)
function arguments() {
  // some code
}

10.禁用caller與callee

'use strict'
function fn() {
  console.log(arguments.callee.caller, fn.caller) // 嚴(yán)格模式下報(bào)錯(cuò);非嚴(yán)格模式指向fn2
  console.log(arguments.callee) // 嚴(yán)格模式報(bào)錯(cuò);非嚴(yán)格模式指向fn
}
function fn2() {
  fn()
}
fn2()

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。


分享題目:javascript嚴(yán)格模式詳解(含嚴(yán)格模式與非嚴(yán)格模式的區(qū)別)
文章位置:http://weahome.cn/article/pchses.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部