Javascript厳格モードuse stript詳細

4199 ワード

厳格なモード:ECMA-622仕様で定義されているJavaScript標準は、javascripに対する制限がより強いです.
(厳格でないモードは、「いい加減モード/緩いモード/だらけモード」と呼ばれています.)
一、厳格モードの使用
厳密なモードはスクリプトまたは関数レベルで実装できます.(グローバルモードとローカルモード)
1.グローバル
jsファイルの一番前に追加します.    「use strict」
2.局部
関数の内部に追加   「use strict」は、以下の通りです

function fn() {
  "use strict";
  //some code
}
二、厳格モードと非厳格モードの対比
1.厳格モードでは変数を削除できません.非厳格モードでは削除に失敗します.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.厳格なモードでは、argmentsオブジェクトは、入力関数内の実参照リストの静的コピー(すなわち、パラメータの変化を追跡しない)である.厳密でないモードでは、argmentsオブジェクト内の要素と対応する実参照は同じ値を指す参照です.
厳格モードで

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とargmentsをキーワードとして、値を与えられたり、変数宣言として使ったりできません.

"use strict";
var eval=3;//  :Unexpected eval or arguments in strict mode
var argument=6;//    
6.厳格なモードは、コールスタックの検出能力を制限し、アルgments.caleeにアクセスし、argments.calerは異常を投げます.
厳しいモードで:

"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
caler:関数が別の関数を呼び出すと、コールされた関数は自動的にcaler属性を生成し、呼び出しの関数オブジェクトを指します.この関数が現在呼び出されていない場合、または他の関数で呼び出されていない場合、
calerは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
スクリプトを実行するには、まずコンパイルしてから実行します.明らかにコンパイルする時、ウィthステートメントブロックの変数がどのオブジェクトに属するかはコンパイル時に決定できません.[with文ブロックの変数は(cl)の属性です.
または前の階層の変数がドメインチェーン内の変数を作用させます.」実行時のみ(c 1)がCloothesの一例であると判断できる.これは厳密モードとコンパイルがあるときに変数が競合するかどうかを確認しますので、厳密モードは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)
厳格なモードの中でcall appyはnull undefinedに入って来ます.そのままwindowに変換されません.
締め括りをつける
以上は小编で绍介したJavascript厳格モードuse striptの详しい解です.皆さんに助けてほしいです.もし何か疑问があれば、メッセージ小编に歓迎してください.