検索
ホームページウェブフロントエンドjsチュートリアルJavaScript の strict モード (「use strict」) を直接見てみる

JavaScript の strict モード (「use strict」) を直接見てみる

Javascript strict モード (「use strict」) の詳細な説明

共有:

Except通常の実行モード。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」を指定する必要はありません。)

<script>
"use strict";
console.log("这是严格模式。");
</script>
<script>
console.log("这是正常模式。");kly, it&#39;s almost 2 years ago now. I can admit it now - I run it on my school&#39;s network that has about 50 computers.
</script>

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

3.2 単一関数の場合

関数本体の最初の行に「use strict」と入力すると、関数全体が「strict モード」で実行されます。

function strict(){
"use strict";
return "这是严格模式。";
}
function notStrict() {
return "这是正常模式。";
}

3.3 スクリプト ファイルを記述する別の方法

最初に呼び出したメソッドはファイルのマージに適していないため、2 番目のメソッドを借用して、スクリプト ファイル全体を 1 つのメソッドにまとめた方が良い方法です。すぐに実行される匿名関数。

(function (){
"use strict";
// some code here
})();

4. 構文と動作の変更

Strict モードでは、JavaScript の構文と動作にいくつかの変更が加えられました。

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

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

"use strict";
v = 1; // 报错,v未声明
for(i = 0; i < 2; i++) { // 报错,i未声明
}

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

4.2 静的バインディング

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

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

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

(1) with ステートメントの使用は禁止されています

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

"use strict";
var v = 1;
with (o){ // 语法错误
v = 2;
}

(2) eval スコープの作成

通常モードでは、JavaScript 言語にはグローバル スコープと関数スコープの 2 つの変数スコープ (スコープ) があります。厳密モードでは、3 番目のスコープである eval スコープが作成されます。

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

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

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

(1) thisキーワードによるグローバルオブジェクトへの参照を禁止

function f(){
return !this;
}
// 返回false,因为"this"指向全局对象,"!this"就是false
function f(){
"use strict";
return !this;
}
// 返回true,因为严格模式下,this的值为undefined,所以"!this"为true。

そのため、コンストラクタを使用する際に、新規追加を忘れた場合は、 、これはグローバル オブジェクトを指しませんが、エラーが報告されます。

function f(){
"use strict";
this.a = 1;
};
f();// 报错,this未定义

(2) 関数内の呼び出しスタックを走査することは禁止されています

function f1(){
"use strict";
f1.caller; // 报错
f1.arguments; // 报错
}
f1();

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

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

"use strict";
var x;
delete x; // 语法错误
var o = Object.create(null, {&#39;x&#39;: {
value: 1,
configurable: true
}});
delete o.x; // 删除成功

4.5 明示的なエラー報告

通常モードでは、オブジェクトの読み取り専用プロパティに値を代入してもエラーは報告されず、警告なしに失敗するだけです。厳密モードでは、エラーが報告されます。

"use strict";
var o = {};
Object.defineProperty(o, "v", { value: 1, writable: false });
o.v = 2; // 报错

厳密モー​​ドでは、ゲッター メソッドを使用して読み取られた属性に値を割り当てるときにエラーが報告されます。

"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 禁止八进制表示法

正常模式下,整数的第一位如果是0,表示这是八进制数,比如0100等于十进制的64。严格模式禁止这种表示法,整数第一位为0,将报错。

"use strict";
var n = 0100; // 语法错误

4.8 arguments对象的限制

arguments是函数的参数对象,严格模式对它的使用做了限制。

(1)不允许对arguments赋值

"use strict";
arguments++; // 语法错误
var obj = { set p(arguments) { } }; // 语法错误
try { } catch (arguments) { } // 语法错误
function arguments() { } // 语法错误
var f = new Function("arguments", "&#39;use strict&#39;; return 17;"); // 语法错误

(2)arguments不再追踪参数的变化

 function f(a) {
a = 2;
return [a, arguments[0]];
}
f(1); // 正常模式为[2,2]
function f(a) {
"use strict";
a = 2;
return [a, arguments[0]];
}
f(1); // 严格模式为[2,1]

(3)禁止使用arguments.callee

这意味着,你无法在匿名函数内部调用自身了。

"use strict";
var f = function() { return arguments.callee; };
f(); // 报错

4.9 函数必须声明在顶层

将来Javascript的新版本会引入”块级作用域”。为了与新版本接轨,严格模式只允许在全局作用域或函数作用域的顶层声明函数。也就是说,不允许在非函数的代码块内声明函数。

"use strict";
if (true) {
function f() { } // 语法错误
}
for (var i = 0; i < 5; i++) {
function f2() { } // 语法错误
}

4.10 保留字

为了向将来Javascript的新版本过渡,严格模式新增了一些保留字:implements, interface, let, package, private, protected, public, static, yield。

使用这些词作为变量名将会报错。

function package(protected) { // 语法错误
"use strict";
var implements; // 语法错误
}

此外,ECMAscript第五版本身还规定了另一些保留字(class, enum, export, extends, import, super),以及各大浏览器自行增加的const保留字,也是不能作为变量名的。

推荐教程:《js基础教程

以上がJavaScript の strict モード (「use strict」) を直接見てみるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事はwebhekで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
JavaScript in Action:実際の例とプロジェクトJavaScript in Action:実際の例とプロジェクトApr 19, 2025 am 12:13 AM

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

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

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

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

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

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

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

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により優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

C/CからJavaScriptへ:すべてがどのように機能するかC/CからJavaScriptへ:すべてがどのように機能するかApr 14, 2025 am 12:05 AM

C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

JavaScriptエンジン:実装の比較JavaScriptエンジン:実装の比較Apr 13, 2025 am 12:05 AM

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

ブラウザを超えて:現実世界のJavaScriptブラウザを超えて:現実世界のJavaScriptApr 12, 2025 am 12:06 AM

現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。

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衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SublimeText3 英語版

SublimeText3 英語版

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

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

SublimeText3 Mac版

SublimeText3 Mac版

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

EditPlus 中国語クラック版

EditPlus 中国語クラック版

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