ホームページ >ウェブフロントエンド >jsチュートリアル >js の strict モードについて知っておくべきことの簡単な分析

js の strict モードについて知っておくべきことの簡単な分析

不言
不言オリジナル
2018-08-29 16:20:351308ブラウズ

この記事の内容は、js の strict モードをマスターするために必要なものについての簡単な分析です。必要な方は参考にしていただければ幸いです。

厳密モード

まず、厳密モードとは何かを理解しましょう。
厳密モードは、サブセットではなく、JavaScript のより制限的なバリアントです。通常のコードとは意味的に大きく異なり、厳密モードをサポートしていないブラウザと厳密モードをサポートするブラウザの動作も異なるため、使用しないでください。厳密モードの機能をテストせずに厳密モード。厳密モードは非厳密モードと共存できるため、スクリプトは段階的かつ選択的に厳密モードに参加できます

  • 厳密モードの目的

まず、厳密モードは JavaScript トラップを直接明白にします。第 2 に、厳密モードは、エンジンが最適化するのが難しいいくつかのエラーを修正します。同じコードが、非厳密モードよりも厳密モードの方が高速になる場合があります。 将来のバージョンで定義される可能性のある構文がいくつかあります

  • 厳密モードをグローバルに有効にする

JavaScriptで厳密モードを有効にするには、すべてのコードの前に変数に割り当てられない文字列を定義する必要があります:

'use strict';//或者"use strict"

以前のJavaScriptが非厳密モードだった場合、このコードでは、厳密モードを盲目的に有効にしないことをお勧めします。これにより、指定した関数に対して厳密モードを 1 つずつ有効にすることもできます。これは、厳密モードをグローバルにオンにする柔軟な実装と同等です

//函数外部依旧是非严格模式
function fun(){
    'user strict';//开启严格模式
}

変数の誤った作成は禁止されています
  • 厳密モードでは、グローバル変数の誤った作成は許可されていません
  • 次の例 コードは誤ってグローバル変数を作成しています非厳密モードの変数
(function(){
    'use strict';//开启严格模式
})();

次のコード例は、誤って厳密モードでグローバル変数を作成しています

//未声明的变量
result='这是一个没用var声明的全局变量';

サイレント失敗は例外になります
  • サイレント失敗とは、エラーを報告することも影響を与えることもありません。定数の値を変更すると、サイレント失敗は例外のスローに変換されます。 注: これは、ブラウザによって異なります。次のコード例は、例外をスローするものです。非厳密モードです。
'use strict';//开启严格模式
//严格模式下,意外创建全局变量,抛出ReferenceError
message='this is message';//ReferenceError: result is not defined
次のコード例です。厳密モードではサイレントエラーです

const PI=3.14;
PI=1.14;//静默失败
console.log(PI);//3.14

削除キーワードを無効にします

  • 厳密モードでは、変数に削除演算子を使用できません

    次のコード例は、非厳密モードで削除演算子を使用すると、結果はサイレント失敗になります
'use strict';//开启严格模式

const PI=3.14;
PI=1.14;//抛出TypeError错误
次のコード例では、厳密モードで削除演算子を使用し、結果は例外になります

var color='red';
delete color;

変数名の制限

  • 厳密モードでは、JavaScript にも変数名に関する制限があり、特に、interface、let、packge、private、protected、public、stalic、yield は、すべて予約語として使用できます。 ECMAScript の次のバージョンでは、これらの識別子を変数名として使用すると構文エラーが発生します

削除不可能な属性

  • 厳密モードでは、削除演算子を使用して削除不可能な属性を削除することはできません

    次のコードは、delete 演算子を使用して、非厳密モードで削除不可能な属性を削除するもので、結果はサイレントエラーになります
'use strict';//开启严格模式

var color='red';
delete color;//SyntaxError: Delete of an unqualified identifier in strict mode.
次のコード例は、削除演算子を使用して、厳密モードで削除不可能な属性を削除します。例外になります

delete Object.prototype;

属性名は一意である必要があります

  • 厳密モードでは、オブジェクト すべての属性名はオブジェクト内で一意である必要があります

    次のコードは、非厳密モードでは重複した名前の属性が許可されることを示しています最後の重複した名前の属性がその属性値を決定します
'use strict';//开启严格模式
delete Object.prototype;//TypeError: Cannot delete property 'prototype' of function Object() { [native code] }
次のコードは、重複した名前の属性が厳密モードで考慮されることを示しています

var o={p:1,p:2};

読み取り専用属性の割り当て

  • 厳密モードでは、読み取り専用属性は再割り当てできません

    次のコードは、非厳密モードで読み取り専用属性を再割り当てするもので、結果はサイレントに失敗します
'use strict';//开启严格模式
var o={p:1,p:2};//不报错但是语法错误
次のコードは、厳密モードで読み取り専用プロパティを再割り当てするものです。結果は例外になります

var obj={};
Object.defineProperty(obj,'name',{
    value:'张三',
    writable:false
});//将属性设置为只读
obj.name='李四';

拡張不可能なオブジェクト

  • 厳密モードでは、新しいプロパティを拡張不可能なオブジェクトに追加することはできません

    次 コード例は、拡張不可能なオブジェクトに新しい属性を追加するものです。非厳密モードでは、結果はサイレントに失敗します
'use strict';//开启严格模式
var obj={};
Object.defineProperty(obj,'name',{
    value:'张三',
    writable:false
});//将属性设置为只读
obj.name='李四';//TypeError: Cannot assign to read only property 'name' of object '#a87fdacec66f0909fc0757c19f2d2b1d'
次のコード例は、厳密モードで拡張不可能なオブジェクトに新しい属性を追加するもので、結果は例外になります

var obj={};
Object.preventExtensinons(obj);//将对象设置为不可扩展
obj.name='张三';

パラメータ名は一意である必要があります

  • 厳密モードでは、名前付き関数のパラメーターは一意である必要があります

    次のコード例は、非厳密モードです。最後の重複したパラメーター名は、以前の重複したパラメーターをカバーします。引数[を介して以前のパラメーターにアクセスできます。 i]
'use strict';//开启严格模式

var obj={};
Object.preventExtensions(obj);//将对象变得不可扩展
obj.name='张三';//TypeError: Cannot add property name, object is not extensible
次のコード例は、厳密モードでの同じ名前のパラメータ間の違いであり、構文エラーとみなされます

function sum(a,a,c){}

arguments

在严格模式下,arguments对象的行为也有所不同
1.非严格模式下,修改命名参数的值也会反应到arguments对象中
2.严格模式下,命名参数与arguments对象是完全独立的

function fun(value){
    value='haha';
    console.log(value);//haha
    console.log(arguments[0]);//非严格模式下 hah
                              //严格模式下 hello
}

showValue('hello');
``

 - arguments.callee()
在严格模式下,不能使用arguments对象的callee()方法
下例代码是非严格模式下使用arguments对象的callee()方法,表示调用函数本身
var f=function(){
return arguments.callee;
};
f();
下例代码是严格模式下使用arguments对象的callee()方法,结果会抛出异常
'use strict';//开启严格模式
var f=function(){
return arguments.callee;
}
f();
/TypeError: 'caller', 'callee', and 'arguments' properties 
may not be accessed on strict mode functions or the arguments objects 
for calls to them/
 - 函数声明的限制
在严格模式下,只能在全局域和函数域中声明函数
下例代码非严格模式下在任何位置声明函数都是合法的
if(true){
function f(){}
}
下例是严格模式下在除全局域和函数域中声明函数是语法错误
'use strict';//开启严格模式
if(true){
function f(){}//语法错误,但是不报错
}
 - 增加eval作用域
在严格模式下,使用eval()函数创建的变量只能在eval()函数内部使用
下例代码是非严格模式下eval()函数创建的变量在其他位置可以使用
eval('var n=40');
console.log(n);//40
下例代码是严格模式下eval()函数创建的变量只能在eval()函数内部使用
'use strict';//开启严格模式
eval('var n=40');
console.log(n);//ReferenceError: n is not defined
 - 禁止读写
在严格模式下,禁止使用eval()和arguments作为标识符,也不允许读写它们的值
1.使用var声明
2.赋予另一个值
3.尝试修改包含的值
4.用作函数名
5.用作命名的函数的参数
6.在try...catch语句中用作例外名
在严格模式下,以下所有尝试将导致语法错误:
'use strict';//开启严格模式
eval=17;
arguments++;
++eval;
var obj={set p(arguments){}};
var eval;
try{}catch(arguments){}
function x(eval){}
function argunments(){}
var y=function eval(){}
var f=new Function('arguments','"use strict";return 20;');
 - 抑制this
在非严格模式下使用函数apply()或call()方法时,null或undefined值会被转换为全局对象
在严格模式下,函数的this值始终是指定的值(无论什么值)。
var color='red';
function sayColor(){
console.log(this.color);//非严格模式下 red
                    /*严格模式下:TypeError: Cannot 
                     read property 'color' of null*/
                     }

相关推荐:

JS设计模式之构造器模式详解

怎么使用JS严格模式

以上がjs の strict モードについて知っておくべきことの簡単な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。