javascript厳格モード詳細(厳格モードと非厳格モードの違いを含む)
4088 ワード
厳格なモデルの長所と短所
利点:コード解析と実行速度を上げる は、いくつかの不合理な文法を禁止し、コードを減らす奇異な行動 。
欠点のいくつかのコードは、厳密なモードではエラーを報告します。特に、共通および第三者モジュールを導入するときは、 に注意が必要です。いくつかの厳格なモードの特性は、異なるブラウザのサポート状況によって異なります。互換性の問題は です。
厳格モードと非厳格モードの違い
1.with文法を禁止し、使用するとエラーが発生します。
with文法を解析する時、スコープの状況は非常に複雑で、コードの解析と運転速度に深刻な影響を与えます。
属性記述子を変える方法は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の属性を削除するとエラーが発生します。
5.未登録の変数には、エラーが発生します。
8.1 evalは独立作用領域がある
9.1 argmentsは形参の副本である(浅いコピーのような)
利点:
欠点
厳格モードと非厳格モードの違い
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()
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。