javascript厳格モード詳細(厳格モードと非厳格モードの違いを含む)


厳格なモデルの長所と短所
利点:
  • コード解析と実行速度を上げる
  • は、いくつかの不合理な文法を禁止し、コードを減らす奇異な行動

  • 欠点
  • のいくつかのコードは、厳密なモードではエラーを報告します。特に、共通および第三者モジュールを導入するときは、
  • に注意が必要です。
  • いくつかの厳格なモードの特性は、異なるブラウザのサポート状況によって異なります。互換性の問題は
  • です。
    厳格モードと非厳格モードの違い
    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.属性記述子(propertyDescripter)関連
    属性記述子を変える方法はObject.defineProperty、Object.defineProperties、Reflect.defineProperty、Reflect.defineProperties、Object.freeze、Object.sealがあります。属性記述子を取得するには、Object.getOwn PropertyDescriptor、Object.getOwn PropertyDecriptos、ES 6にはReflect.getOwn PropertyDescriptor、Reflect.getOwn ProttyDescriptorsがあります。
    3.1 configrable=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.prevent Extensionsがあります。ES 6はReflect.freeze、Reflect.seal、Reflect.prevent Extensがあります。objectが拡張を許可しているかどうかを判断します。Object.isExtensiobleを使ってもいいです。ES 6にはReflect.isExtensiobleもあります。
    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.1 evalは独立作用領域がある
    
    'use strict'
    eval('var a = 1')
    console.log(typeof a) //       undefined;       number
    
    8.2 evalは変数名または関数名として使用できません。類似のキーワードです。
    
    'use strict'
    var eval = 1 //         ;            1   eval
    
    //         ;             eval  
    function eval() {
    // some code
    }
    
    9.argments関連
    9.1 argmentsは形参の副本である(浅いコピーのような)
    
    '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.2アーグメンントは変数名または関数名として使用できません。類似のキーワードです。
    
    'use strict'
    var arguments = 1 //         ;            1   arguments
    
    //         ;             arguments  
    function arguments() {
      // some code
    }
    
    
    10.calerとcaleeを無効にする
    
    'use strict'
    function fn() {
      console.log(arguments.callee.caller, fn.caller) //        ;       fn2
      console.log(arguments.callee) //       ;       fn
    }
    function fn2() {
      fn()
    }
    fn2()
    
    以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。