ホームページ  >  記事  >  ウェブフロントエンド  >  Javascript チュートリアルの strict strict モードの使い方の詳細な説明

Javascript チュートリアルの strict strict モードの使い方の詳細な説明

巴扎黑
巴扎黑オリジナル
2017-09-18 09:25:591749ブラウズ

厳密モード: ECMA-262 仕様によって定義された JavaScript 標準では、JavaScript に対してより強力な制限があります。この記事では主に Javascript の strict モードの use strict について詳しく説明します。必要な友達は参考にしてください。

Strict モード: ECMA-262 仕様で定義された JavaScript 標準には、JavaScript に対する制限が強化されています。

(非厳密モードは「sloppy モード/sparse モード/lazy モード」と呼ばれます。)

1. strict モードの使用

strict モードはスクリプトまたは関数レベルで実装できます。 (つまり、グローバル モードとローカル モード)

1. Global

js ファイルの先頭に「use strict」を追加します

2. Local

次のように関数内に「use strict」を追加します


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

2. 厳密モードと非厳密モードの比較

1. 厳密モードでは、変数を削除できません (delete は非修飾識別子です)。非厳密モードでは、削除に失敗すると false


"use strict";
var x;
delete x;//报错Delete of an unqualified identifier in strict mode.(不合格的标识符)

2 が返されます。厳密モードでは、関数パラメータが同じ名前である場合、非厳密モードではエラーがスローされません

厳密モード


function fn(a,a){
 "use strict";
  result=a+a;
  console.log(result);
}
fn(2,4);//Duplicate parameter name not allowed in this context(重复的参数名称在此上下文中不允许)

非厳密モード


function fn1(a,a){
  "use strict";
  result=a+a;
  console.log(result);
}
fn1(2,4);//结果为8

3. 厳密モードでは、8 進整数リテラルは許可されません (以下に示すように)。非厳密モードではエラーは報告されません。


"use strict"
var x=089;
console.log(x);//报错:Decimals with leading zeros are not allowed in strict mode.

4. 厳密モードでは、引数オブジェクトは渡される関数内の実際のパラメーター リストの静的コピーです (つまり、非厳密モードではパラメーターの変更は追跡されません)。引数オブジェクト内の は、対応する実際のパラメータと同じ値への参照です。

厳密モードの場合


fn(5);
function fn(a){
  "use strict";
  a = 42;
  // return a==arguments[0];//返回false
  console.log(a);//结果为42
  console.log(arguments[0]);//结果为5,严格模式下arguments[0]表示这个调用方法的第一个参数     (不再追踪  参数的变化,在函数内部,参数a被重新赋值为42,但arguments[0]仍然为5.)
}

非厳密モードの場合


fn(5);
function fn(a){
  a = 42;
  // return a==arguments[0];//返回true
  console.log(a);//结果为42
  console.log(arguments[0]);//结果为42(追踪参数变化)

}

5. 厳密モードでは、eval と引数はキーワードとして使用され、変数宣言として割り当てて使用することはできません


"use strict";
var eval=3;//报错:Unexpected eval or arguments in strict mode
var argument=6;//同样报错

6. 厳密モードでは、コールスタックを検出する機能が制限されます。arguments.callee にアクセスすると、arguments.callee.caller は例外をスローします

厳密モードの場合:


"use strict";
function fn(n){
  if(n==0){
    return 1;
  }else{
    return n*arguments.callee(n-1);
  }
}
console.log(fn(5));//报错

非厳密モードの場合:


function fn(n){//阶乘
  if(n==0){
    return 1;
  }else{
    return n*arguments.callee(n-1);
  }
}
console.log(fn(5));//正常120

caller: 関数が別の関数を呼び出すと、呼び出された関数は、それを呼び出した関数オブジェクトを指す caller 属性を自動的に生成します。関数が現在呼び出されていないか、他の関数によって呼び出されない場合、

、caller は null になります。以下の通り:

厳密モードの場合:


"use strict"
function fn1() {
  var n1= fn1.caller;
  console.log(n1);
}
function fn2() {
  fn1();
}
fn2();//报错

非厳密モードの場合:


function fn1() {
  var n1= fn1.caller;//此例中caller指向调用它的函数(fn2)
  console.log(n1);
}
function fn2() {
  fn1();
}
fn2();// 结果打印出:function fn2(){ fn1( ) };

7. 厳密モードの変数は最初に宣言する必要があり、グローバル変数に値を直接代入することはできません。は暗黙的に作成され、 with は使用できません。

厳密モード


"use strict";
with(obj){
  x;
}//报错:Strict mode code may not include a with statement

説明: スクリプトを実行する場合、最初にコンパイルされてから実行されます。明らかに、コンパイル時には、with ステートメント ブロック内の変数がどのオブジェクトに属しているかを判断できません。 [with ステートメント ブロック内の変数は、(cl) の属性、または上位レベルの変数スコープ チェーン内の変数です。 ]。 (c1) が Clothes のインスタンスであるかどうかは、実行時にのみ決定できます。これは、変数がコンパイル時に定義されているかどうかをチェックする厳密モードと競合するため、厳密モードでは with ステートメントは使用されません。

拡張: with ステートメントの使用 (特定のオブジェクト内の既存のプロパティを参照するために使用されますが、オブジェクトにプロパティを追加するために使用することはできません。)

with(object instance)
{
  //代码块
}
eg:function Clothes(){
  this.color="red";
  this.size="m";
  this.price="cheap";
}
var c1=new Clothes();
with(c1){
  var str="颜色:"+color+",尺寸:"+size+",价格:"+price;
  document.write(str);
}//结果(颜色:red,尺寸:m,价格:cheap)

strict モードでは、null 未定義の apply パスを呼び出し、そのままウィンドウに変換

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

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