ホームページ ウェブフロントエンド jsチュートリアル JavaScript strictモード_javascriptスキルの詳細説明

JavaScript strictモード_javascriptスキルの詳細説明

May 16, 2016 pm 03:31 PM

ご存知のとおり、JavaScript は柔軟な言語です。その柔軟性は多くの落とし穴ももたらしますが、もちろん、中には設計上の欠陥もあります。たとえば

変数には宣言なしで値が割り当てられます。デフォルトは

などのグローバル変数です。
(function () {
 a = 3;
})();
console.log(window.a); // 输出3
ログイン後にコピー

オブジェクトには同じ名前の属性が複数あり、最後に割り当てられた属性が以前の値を上書きします。

など
var obj = {
 c: 3,
 c: 4
}
// obj 为 {c:4}
ログイン後にコピー

== や typeof などの落とし穴は無数にあります。結局のところ、JavaScript の父は言語の設計に 1 週​​間しか費やしませんでした (笑)。

JavaScript の厳密モードとは

JavaScript の厳密モードでは、JavaScript の記述方法にいくつかの制限があります。厳密モードでこれらの制限に違反すると、コードはエラーを報告します。

1. 概要

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

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

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

- コード操作のいくつかの安全でない側面を排除し、コード操作の安全性を確保します。

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

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

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

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

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

2. エントリーサイン 「厳密モード」に入る兆候は次の行です:

「厳密に使用する」;


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

3. の呼び出し方法 「ストリクトモード」には、シーンに合わせて2つの呼び出し方法があります。

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

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

<script>
  "use strict";
  console.log("这是严格模式。");
</script>
<script>
  console.log("这是正常模式。");
</script>
ログイン後にコピー
上記のコードは、Web ページに 2 つの Javascript コードがあることを示しています。前者のスクリプト タグは厳密モードですが、後者のスクリプト タグは厳密モードではありません。

3.2 単一関数の場合

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

function strict(){
  "use strict";
  return "这是严格模式。";
}
function notStrict() {
  return "这是正常模式。";
}
ログイン後にコピー
3.3 スクリプト ファイルを記述する別の方法

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

(function (){
  "use strict";
// some code here
})();
ログイン後にコピー

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

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

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

"use strict";
v = 1; 
// 报错,v未声明
for(i = 0; i < 2; i++) { 
// 报错,i未声明
}
ログイン後にコピー
したがって、厳密モードでは、使用する前に変数を var コマンドで宣言する必要があります。

4.2 静的バインディング

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

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

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

(1) with ステートメント

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

(2)创设eval作用域

正常模式下,Javascript语言有两种变量作用域(scope):全局作用域和函数作用域。严格模式创设了第三种作用域:eval作用域。

正常模式下,eval语句的作用域,取决于它处于全局作用域,还是函数作用域。严格模式下,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。

因此,使用构造函数时,如果忘了加new,this不再指向全局对象,而是报错。

function f(){
  "use strict";
  this.a = 1;
};
f();
// 报错,this未定义
ログイン後にコピー

(2)禁止在函数内部遍历调用栈

function f1(){
  "use strict";
  f1.caller; 
// 报错
  f1.arguments; 
// 报错
}
f1();
ログイン後にコピー

4.4 禁止删除变量

严格模式下无法删除变量。只有configurable设置为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; 
// 报错
ログイン後にコピー

严格模式下,对一个使用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 禁止八进制表示法

正常模式下,整数的第一位如果是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", "'use strict'; 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。它们也是不能使用的。

以上内容是小编给大家介绍的关于JavaScript严格模式详解的全部内容,希望大家喜欢。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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)

フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? Apr 04, 2025 pm 02:42 PM

フロントエンドのサーマルペーパーチケット印刷のためのよくある質問とソリューションフロントエンド開発におけるチケット印刷は、一般的な要件です。しかし、多くの開発者が実装しています...

誰がより多くのPythonまたはJavaScriptを支払われますか? 誰がより多くのPythonまたはJavaScriptを支払われますか? Apr 04, 2025 am 12:09 AM

スキルや業界のニーズに応じて、PythonおよびJavaScript開発者には絶対的な給与はありません。 1. Pythonは、データサイエンスと機械学習でさらに支払われる場合があります。 2。JavaScriptは、フロントエンドとフルスタックの開発に大きな需要があり、その給与もかなりです。 3。影響要因には、経験、地理的位置、会社の規模、特定のスキルが含まれます。

javascriptの分解:それが何をするのか、なぜそれが重要なのか javascriptの分解:それが何をするのか、なぜそれが重要なのか Apr 09, 2025 am 12:07 AM

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? Apr 04, 2025 pm 05:09 PM

同じIDを持つ配列要素をJavaScriptの1つのオブジェクトにマージする方法は?データを処理するとき、私たちはしばしば同じIDを持つ必要性に遭遇します...

Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は?
または:
Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は? または: Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Apr 04, 2025 pm 05:36 PM

この記事の視差スクロールと要素のアニメーション効果の実現に関する議論では、Shiseidoの公式ウェブサイト(https://www.shisido.co.co.jp/sb/wonderland/)と同様の達成方法について説明します。

Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Apr 04, 2025 pm 05:12 PM

Console.log出力の違いの根本原因に関する詳細な議論。この記事では、Console.log関数の出力結果の違いをコードの一部で分析し、その背後にある理由を説明します。 �...

JavaScriptは学ぶのが難しいですか? JavaScriptは学ぶのが難しいですか? Apr 03, 2025 am 12:20 AM

JavaScriptを学ぶことは難しくありませんが、挑戦的です。 1)変数、データ型、関数などの基本概念を理解します。2)非同期プログラミングをマスターし、イベントループを通じて実装します。 3)DOM操作を使用し、非同期リクエストを処理することを約束します。 4)一般的な間違いを避け、デバッグテクニックを使用します。 5)パフォーマンスを最適化し、ベストプラクティスに従ってください。

フロントエンド開発でVSCodeと同様に、パネルドラッグアンドドロップ調整機能を実装する方法は? フロントエンド開発でVSCodeと同様に、パネルドラッグアンドドロップ調整機能を実装する方法は? Apr 04, 2025 pm 02:06 PM

フロントエンドのVSCodeと同様に、パネルドラッグアンドドロップ調整機能の実装を調べます。フロントエンド開発では、VSCODEと同様のVSCODEを実装する方法...

See all articles