検索
ホームページウェブフロントエンドjsチュートリアルJavascript_javascript スキルの厳密モードの詳細な紹介

「厳密モード」は ECMA-262 Edition 5 で定義された新しい構文であり、これまで一般的に使用されていた一部の書き込みメソッドでは、次のような SyntaxError 例外がスローされることを意味します。 1. 変数
の前に var 宣言がありません。 2. 8 進数の構文を使用します: var n = 023 および var s = "

1. 「strict モード」を使用する理由


「strict モード」を確立する主な目的は次のとおりです。
1. Javascript 構文の不合理で不正確な部分を削除し、いくつかの奇妙な動作を削減します。
2. コード実行の安全性を確保し、コンパイラーの効率を向上させます。実行速度;
4. 将来の Javascript の新しいバージョンへの道を切り開く。

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

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

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

2. 「厳密モード」を宣言します


「厳密モード」の宣言は、1 つのステートメントだけで非常に簡単です:

コードをコピーします

コードは次のとおりです:

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


3. 「厳密モード」を宣言する位置と文脈

スクリプト ファイルの最初の行に「use strict」と入力すると、スクリプト全体が「strict モード」で実行されます。このステートメント行が最初の行ではない場合、その行は無効となり、スクリプト全体が「通常モード」で実行されます。異なるモードのコード ファイルが 1 つのファイルにマージされる場合、これには特別な注意が必要です。
(厳密には、実際の演算結果を生成する文が前にない限り、空のセミコロンの直後など、最初の行に「use strict」を指定する必要はありません。)

コードをコピー

コードは次のとおりです:

<script><P>"use strict"; <BR>console.log("これは strict モードです。");</script>

<script><span>console.log("これは通常モードです。");<a style="CURSOR: pointer" data="20709" class="copybut" id="copybut20709" onclick="doCopy('code20709')"></script> 上記のコードは、Web ページに 2 つの Javascript コードがあることを示しています。前者のスクリプト タグは厳密モードですが、後者のスクリプト タグは厳密モードではありません。

2. 単一関数の場合


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




コードをコピー

コードは次のとおりです:

function strict(){" use strict" ;

return "これは strict モードです。";

}
function notStrict() {

return "これは通常モードです。";}

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

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

(function (){

"use strict";
// ここにコードをいくつか示します

})();

4. 「厳密モード」での構文と動作の変更

「厳密モード」では、JavaScript の構文と動作にいくつかの変更が加えられています。

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

通常モードでは、変数を使用するときに、最初に var で変数を宣言する必要はありません (明示的宣言)。しかし、Strict モードでは、変数は使用する前に var で宣言する必要があります。そうしないと、エラーが発生します。 。

コードをコピー コードは次のとおりです:

"use strict";
v = 1; // エラーが報告されました、v は宣言されていません
for(i = 0; i }

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

2. 静的バインディング

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

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

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

(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

3. セキュリティ対策の強化

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

コードをコピー コードは次のとおりです

function f(){
return !this;
}
// "this" がグローバル オブジェクト "!this" を指しているため、false を返します。 is false
function f (){
"use strict";
return !this;
}

// strict モードでは this の値は true を返します。未定義なので、「!this」は true です。
したがって、コンストラクターを使用するときに new を追加するのを忘れると、これはグローバル オブジェクトを指さなくなり、エラーが報告されます。
コードをコピー コードは次のとおりです。

function f(){

"use strict";
this.a = 1;
};
f();// エラー、これは未定義です


通常の関数呼び出し f() では、this の値はグローバル オブジェクトを指します。厳密モードでは、この関数が call および apply によって呼び出された場合、thisvalue パラメーターが指定されている場合、this の値は未定義を指します。 null と未定義を除くプリミティブ値 (文字列、数値、ブール値) の場合、thisvalue パラメータの値が未定義または null の場合、this の値はそのプリミティブ値に対応するパッケージング オブジェクトになります。 this の値はグローバル オブジェクトを指します。厳密モードでは、this の値は型変換なしの thisvalue パラメーターの値になります。

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

コードをコピーしますコードは次のとおりです:

function f1(){

"use strict";
f1.caller; // エラー報告
f1.arguments; // エラー報告
}
f1();

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

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

コードをコピー コードは次のとおりです:

"use strict";
var x;
delete x; // 構文エラー
var o = Object.create(null, 'x', {
value: 1,
configurable: true
});
delete o.x ; // 削除成功

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 ; // エラーを報告します

6. 名前の重複エラー

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

(1) オブジェクトは重複する名前の属性を持つことはできません

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

コードをコピー コードは次のとおりです:

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

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

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

コードをコピーします コードは次のとおりです:

"use strict";
関数f(a , a, b) { // 構文エラー
return ;
}

7. 8 進表記は禁止されています

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

コードをコピー コードは次のとおりです:

"use strict";
var n = 0100 ; // 構文エラー
8. 引数オブジェクト
の制限

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

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

コードをコピー コードは次のとおりです次のように:

"use strict";
arguments ; // 構文エラー
var obj = { set p(arguments) { } } // 構文エラー
try { } catch ( argument) { } // 構文エラー
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) {
"厳密な使用";
a = 2;
return [a, argument[0]];
}
f (1); // 厳密モードは [2,1]

(3) argument.callee の使用は禁止されています

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

コードをコピー コードは次のとおりです:

"use strict";
var f = function () { return argument.callee };
f(); // エラーを報告します

9. 関数は最上位レベルで宣言する必要があります

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

コードをコピー コードは次のとおりです。

"use strict";
if (true) {
function f() { } // 構文エラー
}
for (var i = 0; i function f2() { } //構文エラー
}


10. 予約語

将来 JavaScript の新しいバージョンに移行するために、strict モードには新しい予約語がいくつか追加されます:implements、interface、let、package、private、protected、public、static、yield。
これらの単語を変数名として使用すると、エラーが発生します。

コードをコピー コードは次のとおりです。

function package(protected) { // 構文error
"use strict";
varimplements; // 構文エラー
}

さらに、ECMAscript の 5 番目のバージョン自体も他の予約語 (class、enum、export、 extends、import、super)、および主要なブラウザで追加された const 予約語は変数名として使用できません。
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
es6数组怎么去掉重复并且重新排序es6数组怎么去掉重复并且重新排序May 05, 2022 pm 07:08 PM

去掉重复并排序的方法:1、使用“Array.from(new Set(arr))”或者“[…new Set(arr)]”语句,去掉数组中的重复元素,返回去重后的新数组;2、利用sort()对去重数组进行排序,语法“去重数组.sort()”。

JavaScript的Symbol类型、隐藏属性及全局注册表详解JavaScript的Symbol类型、隐藏属性及全局注册表详解Jun 02, 2022 am 11:50 AM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于Symbol类型、隐藏属性及全局注册表的相关问题,包括了Symbol类型的描述、Symbol不会隐式转字符串等问题,下面一起来看一下,希望对大家有帮助。

原来利用纯CSS也能实现文字轮播与图片轮播!原来利用纯CSS也能实现文字轮播与图片轮播!Jun 10, 2022 pm 01:00 PM

怎么制作文字轮播与图片轮播?大家第一想到的是不是利用js,其实利用纯CSS也能实现文字轮播与图片轮播,下面来看看实现方法,希望对大家有所帮助!

JavaScript对象的构造函数和new操作符(实例详解)JavaScript对象的构造函数和new操作符(实例详解)May 10, 2022 pm 06:16 PM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于对象的构造函数和new操作符,构造函数是所有对象的成员方法中,最早被调用的那个,下面一起来看一下吧,希望对大家有帮助。

JavaScript面向对象详细解析之属性描述符JavaScript面向对象详细解析之属性描述符May 27, 2022 pm 05:29 PM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于面向对象的相关问题,包括了属性描述符、数据描述符、存取描述符等等内容,下面一起来看一下,希望对大家有帮助。

javascript怎么移除元素点击事件javascript怎么移除元素点击事件Apr 11, 2022 pm 04:51 PM

方法:1、利用“点击元素对象.unbind("click");”方法,该方法可以移除被选元素的事件处理程序;2、利用“点击元素对象.off("click");”方法,该方法可以移除通过on()方法添加的事件处理程序。

整理总结JavaScript常见的BOM操作整理总结JavaScript常见的BOM操作Jun 01, 2022 am 11:43 AM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于BOM操作的相关问题,包括了window对象的常见事件、JavaScript执行机制等等相关内容,下面一起来看一下,希望对大家有帮助。

foreach是es6里的吗foreach是es6里的吗May 05, 2022 pm 05:59 PM

foreach不是es6的方法。foreach是es3中一个遍历数组的方法,可以调用数组的每个元素,并将元素传给回调函数进行处理,语法“array.forEach(function(当前元素,索引,数组){...})”;该方法不处理空数组。

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ヘンタイを無料で生成します。

ホットツール

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。