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

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

Aug 29, 2018 pm 04:20 PM
厳密モード

この記事の内容は、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 '#<Object>'
ログイン後にコピー
次のコード例は、厳密モードで拡張不可能なオブジェクトに新しい属性を追加するもので、結果は例外になります

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(&#39;var n=40&#39;);
console.log(n);//40
ログイン後にコピー
下例代码是严格模式下eval()函数创建的变量只能在eval()函数内部使用
ログイン後にコピー
&#39;use strict&#39;;//开启严格模式
eval(&#39;var n=40&#39;);
console.log(n);//ReferenceError: n is not defined
ログイン後にコピー
 - 禁止读写
在严格模式下,禁止使用eval()和arguments作为标识符,也不允许读写它们的值
1.使用var声明
2.赋予另一个值
3.尝试修改包含的值
4.用作函数名
5.用作命名的函数的参数
6.在try...catch语句中用作例外名
在严格模式下,以下所有尝试将导致语法错误:
ログイン後にコピー
&#39;use strict&#39;;//开启严格模式
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(&#39;arguments&#39;,&#39;"use strict";return 20;&#39;);
ログイン後にコピー
 - 抑制this
在非严格模式下使用函数apply()或call()方法时,null或undefined值会被转换为全局对象
在严格模式下,函数的this值始终是指定的值(无论什么值)。
ログイン後にコピー
var color=&#39;red&#39;;
function sayColor(){
console.log(this.color);//非严格模式下 red
                    /*严格模式下:TypeError: Cannot 
                     read property &#39;color&#39; of null*/
                     }
ログイン後にコピー

相关推荐:

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

怎么使用JS严格模式

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

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Python vs. JavaScript:学習曲線と使いやすさ Python vs. JavaScript:学習曲線と使いやすさ Apr 16, 2025 am 12:12 AM

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

JavaScriptとWeb:コア機能とユースケース JavaScriptとWeb:コア機能とユースケース Apr 18, 2025 am 12:19 AM

Web開発におけるJavaScriptの主な用途には、クライアントの相互作用、フォーム検証、非同期通信が含まれます。 1)DOM操作による動的なコンテンツの更新とユーザーインタラクション。 2)ユーザーエクスペリエンスを改善するためにデータを提出する前に、クライアントの検証が実行されます。 3)サーバーとのリフレッシュレス通信は、AJAXテクノロジーを通じて達成されます。

JavaScript in Action:実際の例とプロジェクト JavaScript in Action:実際の例とプロジェクト Apr 19, 2025 am 12:13 AM

現実世界でのJavaScriptのアプリケーションには、フロントエンドとバックエンドの開発が含まれます。 1)DOM操作とイベント処理を含むTODOリストアプリケーションを構築して、フロントエンドアプリケーションを表示します。 2)node.jsを介してRestfulapiを構築し、バックエンドアプリケーションをデモンストレーションします。

JavaScriptエンジンの理解:実装の詳細 JavaScriptエンジンの理解:実装の詳細 Apr 17, 2025 am 12:05 AM

JavaScriptエンジンが内部的にどのように機能するかを理解することは、開発者にとってより効率的なコードの作成とパフォーマンスのボトルネックと最適化戦略の理解に役立つためです。 1)エンジンのワークフローには、3つの段階が含まれます。解析、コンパイル、実行。 2)実行プロセス中、エンジンはインラインキャッシュや非表示クラスなどの動的最適化を実行します。 3)ベストプラクティスには、グローバル変数の避け、ループの最適化、constとletsの使用、閉鎖の過度の使用の回避が含まれます。

Python vs. JavaScript:コミュニティ、ライブラリ、リソース Python vs. JavaScript:コミュニティ、ライブラリ、リソース Apr 15, 2025 am 12:16 AM

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

Python vs. JavaScript:開発環境とツール Python vs. JavaScript:開発環境とツール Apr 26, 2025 am 12:09 AM

開発環境におけるPythonとJavaScriptの両方の選択が重要です。 1)Pythonの開発環境には、Pycharm、Jupyternotebook、Anacondaが含まれます。これらは、データサイエンスと迅速なプロトタイピングに適しています。 2)JavaScriptの開発環境には、フロントエンドおよびバックエンド開発に適したnode.js、vscode、およびwebpackが含まれます。プロジェクトのニーズに応じて適切なツールを選択すると、開発効率とプロジェクトの成功率が向上する可能性があります。

JavaScript通訳者とコンパイラにおけるC/Cの役割 JavaScript通訳者とコンパイラにおけるC/Cの役割 Apr 20, 2025 am 12:01 AM

CとCは、主に通訳者とJITコンパイラを実装するために使用されるJavaScriptエンジンで重要な役割を果たします。 1)cは、JavaScriptソースコードを解析し、抽象的な構文ツリーを生成するために使用されます。 2)Cは、Bytecodeの生成と実行を担当します。 3)Cは、JITコンパイラを実装し、実行時にホットスポットコードを最適化およびコンパイルし、JavaScriptの実行効率を大幅に改善します。

Webサイトからアプリまで:JavaScriptの多様なアプリケーション Webサイトからアプリまで:JavaScriptの多様なアプリケーション Apr 22, 2025 am 12:02 AM

JavaScriptは、Webサイト、モバイルアプリケーション、デスクトップアプリケーション、サーバー側のプログラミングで広く使用されています。 1)Webサイト開発では、JavaScriptはHTMLおよびCSSと一緒にDOMを運用して、JQueryやReactなどのフレームワークをサポートします。 2)ReactNativeおよびIonicを通じて、JavaScriptはクロスプラットフォームモバイルアプリケーションを開発するために使用されます。 3)電子フレームワークにより、JavaScriptはデスクトップアプリケーションを構築できます。 4)node.jsを使用すると、JavaScriptがサーバー側で実行され、高い並行リクエストをサポートします。

See all articles