検索

1. 概要

通常の動作モードに加えて、ECMAscript 5 には 2 番目の動作モード「strict モード」が追加されています。名前が示すように、このモードでは Javascript がより厳しい条件で実行されます。

「厳密モード」を確立する主な目的は次のとおりです:

- Javascript 構文の不合理で不正確な部分を削除し、いくつかの奇妙な動作を削減します

- コード実行のいくつかの危険な部分を削除して、コード実行の安全性

- コンパイラの効率を向上させ、実行速度を向上させます

- 将来の Javascript の新しいバージョンへの道を開きます。

「厳密モード」は、JavaScript のより合理的で安全かつ厳密な開発方向を体現しており、IE 10 を含む主流ブラウザはすでにそれをサポートしており、多くの大規模プロジェクトがそれを全面的に採用し始めています。

一方で、同じコードでも「厳密モード」では実行結果が異なる場合があります。「通常モード」で実行できる一部のステートメントは「厳密モード」では実行されません。これらの内容をマスターすると、JavaScript をより詳しく理解し、より優れたプログラマーになれるでしょう。

この記事では「strictモード」について詳しく紹介します。

2. サインの入力

「厳密モード」に入るサインは次の行です:

"use strict";

古いバージョンのブラウザでは、これを通常の文字列の行として扱い、無視します。

3.通話方法

「厳密モード」には、さまざまな場面に適した2つの通話方法があります。

3.1 スクリプトファイル全体の場合

スクリプトファイルの最初の行に「use strict」と入力すると、スクリプト全体が「strict モード」で実行されます。このステートメント行が最初の行ではない場合、効果はなく、スクリプト全体が「通常モード」で実行されます。異なるモードのコード ファイルが 1 つのファイルにマージされる場合、これには特別な注意が必要です。

(厳密には、その前の文が実際の演算結果を生成する文でない限り、空のセミコロンの直後など、先頭行に「use strict」がある必要はありません。)


"use strict" ";
console.log("これは strict モードです。");

<script><br/> console.log("これは通常モードです。");kly 、もうほぼ 2 年前のことです。今なら認めることができます - 私は約 50 台のコンピューターがある学校のネットワーク上でそれを実行しています。<br/> </script>

上記のコードは、1 つのファイルに 2 つの Javascript コードがあることを示しています。ウェブページ。前者のスクリプト タグは厳密モードですが、後者のスクリプト タグは厳密モードではありません。

3.2 単一関数の場合

関数本体の最初の行に「use strict」と入力すると、関数全体が「strict モード」で実行されます。 3.3 スクリプト ファイルを記述する別の方法

最初の呼び出しメソッドはファイルのマージに役立たないため、より良いアプローチは 2 番目のメソッドを借用し、すぐに実行される匿名関数にスクリプト ファイル全体を入れることです。


(function (){

"use strict";


// ここにいくつかのコード
})();

4. 構文と動作の変更

Strict モードは Javascript の構文と動作に影響します。いくつかの変更を加えました。

4.1 グローバル変数の明示的な宣言

通常モードでは、宣言されずに変数に値が割り当てられた場合、デフォルトでグローバル変数になります。厳密モードではこの使用は禁止されており、グローバル変数は明示的に宣言する必要があります。

"use strict";

v = 1 // エラー、v が宣言されていません

for(i = 0; i }

したがって、strict モードでは、使用する前に var コマンドで変数を宣言する必要があります。

4.2 静的バインディング

Javascript 言語の特徴は、「動的バインディング」、つまり、特定のプロパティとメソッドがどのオブジェクトに属するかがコンパイル時には決定されず、実行時に決定されることです。

厳密モードでは、動的バインディングにいくつかの制限が課されます。場合によっては、静的バインディングのみが許可されます。つまり、プロパティとメソッドがどのオブジェクトに属するかは、コンパイル段階で決定されます。これにより、コンパイル効率が向上し、コードが読みやすくなり、予期せぬ事態が少なくなります。

具体的には、次のような側面が含まれます。

(1) with ステートメント

の使用は禁止されています。これは、with ステートメントはコンパイル時に属性がどのオブジェクトに属しているかを判断できないためです。

"use strict";

var v = 1;

with (o){ // 構文エラー
v = 2;
}

(2) 通常モードで eval スコープ

を作成し、 Javascript 言語には、グローバル スコープと関数スコープの 2 種類の変数スコープがあります。厳密モードでは、3 番目のスコープである eval スコープが作成されます。

通常モードでは、eval ステートメントのスコープは、グローバル スコープにあるか関数スコープにあるかによって異なります。 strict モードでは、eval ステートメント自体がスコープとなり、グローバル変数を生成できなくなります。生成された変数は eval 内でのみ使用できます。

"厳密な使用";

var x = 2;

console.info(eval("var x = 5; x")) // 5

console.info(x);

4.3 セキュリティ対策の強化

(1) このキーワードがグローバルオブジェクトを指すことを禁止する

function f(){

return !this;
}
// "this" が指すので false を返すグローバル オブジェクト Object に対して、"!this" は false

function f(){

"use strict";
return !this;
}
// strict モードでは this の値が未定義であるため、true を返します。したがって、「!this」は true です。

したがって、コンストラクターを使用するときに、new を追加するのを忘れると、これはグローバル オブジェクトを指さなくなり、エラーが報告されます。

function f(){

"use strict";

this.a = 1;

};

f() // エラー、これは定義されていません

;

(2) 関数内のコールスタックをトラバースすることは禁止されています

function f1(){

"use strict";

f1.caller; // エラーを報告します

f1.arguments; // Report an error

}

f1();

4.4 変数の削除は禁止されています

厳密モードでは変数を削除できません。構成可能項目が true に設定されているオブジェクト プロパティのみを削除できます。

"use strict";

var x;

delete x; // 構文エラー

var o = Object.create(null, {'x': {
value: 1,
configurable: true
} });

delete o.x; //削除に成功しました

4.5 明示的なエラー報告

通常モードでは、オブジェクトの読み取り専用属性に値を代入してもエラーは報告されませんが、通知なく失敗するだけです。 。厳密モードでは、エラーが報告されます。

"use strict";
var o = {};

Object.defineProperty(o, "v", { value: 1, writable: false });

o.v = 2; // エラーを報告します

strict このモードでは、getter メソッドを使用して読み取られたプロパティに値を割り当てるときにエラーが報告されます。

"use strict";
var o = {
get v() { return 1; }

};

o.v = 2; // エラー

であるオブジェクトに新しいオブジェクトを追加します。拡張プロパティで禁止されている場合は、エラーが報告されます。

"use strict";

var o = {};

Object.preventExtensions(o);

o.v = 1; // エラー

削除できない属性を削除した場合場合、エラーが報告されます。

"use strict";

delete Object.prototype // エラーを報告する

4.6 名前の重複エラー

厳密モードには、いくつかの新しい構文エラーが追加されました。

(1) オブジェクトは同じ名前の属性を持つことができません

通常モードでは、オブジェクトに同じ名前の複数の属性がある場合、最後に割り当てられた属性が前の値を上書きします。厳密モードでは、これは構文エラーです。

"use strict";

var o = {
p: 1,
p: 2
} // 構文エラー

(2) 関数は重複した名前のパラメータを持つことはできません

通常モードの場合, 関数に同じ名前の複数のパラメーターがある場合、arguments[i] を使用してそれらを読み取ることができます。厳密モードでは、これは構文エラーです。

"use strict";

function f(a, a, b) { // 構文エラー

return ;

}

4.7 8進表記は禁止

通常モードでは最初の整数ビットが 0 の場合、それは 8 進数であることを意味します。たとえば、0100 は 10 進数の 64 に相当します。厳密モードではこの表現は禁止されており、整数の最初のビットは 0 であり、エラーが報告されます。

"use strict";

var n = 0100; // 構文エラー

4.8 引数の制限 object

arguments は関数のパラメータオブジェクトであり、strict モードではその使用が制限されます。

(1) 引数への代入は許可されていません

"use strict";

arguments++ // 構文エラー

var obj = { set p(arguments) { } } // 構文エラー

; try { } catch (arguments) { } // 構文エラー

function argument() { } // 構文エラー

var f = new Function("arguments", "'use strict'; return 17;") / / 構文エラー

(2) 引数はパラメーターの変更を追跡しなくなりました

function f(a) {

a = 2;

return [a, argument[0]];

}

f (1); // 通常モードは [2,2] です

function f(a) {

"use strict";

a = 2;

return [a, argument[0]];

}

f(1) // Strictモードは[2, 1]

(3) argument.callee

の使用は禁止されています。これは、匿名関数内で自分自身を呼び出すことができないことを意味します。

"use strict";

var f = function() { return argument.callee; };

f() // エラーを報告する

4.9 関数はトップレベルで宣言する必要があります

将来のバージョンの新しい Javascript では、「ブロックレベルのスコープ」が導入されます。新しいバージョンに準拠するために、厳密モードでは、グローバル スコープまたは関数スコープの最上位レベルで関数を宣言することのみが許可されます。つまり、関数以外のコード ブロック内で関数を宣言することはできません。

"use strict";

if (true) {

function f() { } // 構文エラー

}

for (var i = 0; i

function f2() { } // 構文エラー

}

4.10 予約語

将来の Javascript の新しいバージョンに移行するために、strict モードにはいくつかの新しい予約語が追加されました:implements、interface、 let、パッケージ、プライベート、プロテクト、パブリック、静的、yield。

これらの単語を変数名として使用するとエラーが発生します。

function package(protected) { // 構文エラー

"use strict";

varimplements; // 構文エラー

}

さらに、ECMAscript の 5 番目のバージョン自体も他の予約語 ( class、enum、export、extends、import、super)、および主要なブラウザで追加された const 予約語は変数名として使用できません。

5. 参考リンク

- MDN、ストリクト モード
- アクセル ラウシュマイヤー博士、JavaScript のストリクト モード: 概要
- Douglas Crockford、ストリクト モードが登場

この記事では、JavaScript ストリクト モードについて説明します。関連コンテンツについては、php 中国語 Web サイトにご注意ください。

関連するおすすめ:

ログイン機能を実装するためのPHPの関連コード解析

JavaScript関連の内容の解説

HTMLの基礎の解説

以上がJavascript strictモードの詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

PythonとJavaScriptの将来の傾向には、1。Pythonが科学コンピューティングの分野での位置を統合し、AI、2。JavaScriptはWebテクノロジーの開発を促進します。どちらもそれぞれのフィールドでアプリケーションシナリオを拡大し続け、パフォーマンスをより多くのブレークスルーを行います。

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で書かれていますか?証拠を調べるJavaScriptはCで書かれていますか?証拠を調べるApr 25, 2025 am 12:15 AM

はい、JavaScriptのエンジンコアはCで記述されています。1)C言語は、JavaScriptエンジンの開発に適した効率的なパフォーマンスと基礎となる制御を提供します。 2)V8エンジンを例にとると、そのコアはCで記述され、Cの効率とオブジェクト指向の特性を組み合わせて書かれています。3)JavaScriptエンジンの作業原理には、解析、コンパイル、実行が含まれ、C言語はこれらのプロセスで重要な役割を果たします。

JavaScriptの役割:WebをインタラクティブでダイナミックにするJavaScriptの役割:WebをインタラクティブでダイナミックにするApr 24, 2025 am 12:12 AM

JavaScriptは、Webページのインタラクティブ性とダイナミズムを向上させるため、現代のWebサイトの中心にあります。 1)ページを更新せずにコンテンツを変更できます。2)Domapiを介してWebページを操作する、3)アニメーションやドラッグアンドドロップなどの複雑なインタラクティブ効果、4)ユーザーエクスペリエンスを改善するためのパフォーマンスとベストプラクティスを最適化します。

CおよびJavaScript:接続が説明しましたCおよびJavaScript:接続が説明しましたApr 23, 2025 am 12:07 AM

CおよびJavaScriptは、WebAssemblyを介して相互運用性を実現します。 1)CコードはWebAssemblyモジュールにコンパイルされ、JavaScript環境に導入され、コンピューティングパワーが強化されます。 2)ゲーム開発では、Cは物理エンジンとグラフィックスレンダリングを処理し、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がサーバー側で実行され、高い並行リクエストをサポートします。

Python vs. JavaScript:ユースケースとアプリケーションと比較されますPython vs. JavaScript:ユースケースとアプリケーションと比較されますApr 21, 2025 am 12:01 AM

Pythonはデータサイエンスと自動化により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、データ処理とモデリングのためにNumpyやPandasなどのライブラリを使用して、データサイエンスと機械学習でうまく機能します。 2。Pythonは、自動化とスクリプトにおいて簡潔で効率的です。 3. JavaScriptはフロントエンド開発に不可欠であり、動的なWebページと単一ページアプリケーションの構築に使用されます。 4. JavaScriptは、node.jsを通じてバックエンド開発において役割を果たし、フルスタック開発をサポートします。

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の実行効率を大幅に改善します。

See all articles

ホット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 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。