javaScript厳格モード

11580 ワード

1.「use strict」は厳しいモードをオンにします.
(1)scriptタグに厳格モードを開く(2)functionに厳格モードfunctionを開く(){use strict”;
2.厳格モードの違い
(1)スペルエラーを異常に変換する
a.グローバル変数を意外に作成できませんでした.
"use strict";
var hei;
hie = 1;
Uncaugt ReferenceError:hie is not defined
b.沈黙に失敗した割当値は異常を投げます.
サイレント失敗(silently fall):エラーを報告しなくても効果がありません.書き込み不可属性に値を付け、読み取り専用属性に値を付け、拡張不可能なオブジェクトの新しい属性に値を割り当てます.これらの場合は、サイレントの失敗を引き起こすことができます.
"use strict";
var fixed = {};
Object.preventExtensions(fixed);
fixed.addProp = "hi";
Uncaght Type Errror:Canot add property newProp,object is not extensedible
c.削除できない属性を削除しようとしたときに異常が発生します.
"use strict";
delete Object.prototype;
Uncaugt Type Error:Canot delete property‘prototype’of function Object(){native code}
d.Geckoバージョン34の前に、一つのオブジェクト内の全ての属性名がオブジェクト内で唯一であることが要求されていたが、現在はこのバグがない.
"use strict";
var obj = {p: 1, p: 2};
e.要求関数のパラメータ名が唯一です.
厳密モードではなく、同じ名前のパラメータの後者は前者をカバーしますが、前者はやはりargments[i]でアクセスできます.厳しいモードでは文法エラーがあります.
function sum (a, a, c) {
    "use strict";
    return a + b + c;
}
Uncaugt SyntxError:Duplicate parameter name not allowed in this context
f.8進数表記禁止文法
ブラウザは8進数の文法をサポートします.
var a = 010;
console.log(a); // a = 8;
ES 6は、1つの数字に「0」を付けるプレフィックスをサポートし、8進数を表します.ただし、開発者によっては「0」を省略してしまうことがあります.これは間違いを招く可能性がありますので、厳密なモードは8進数禁止です.文法の間違いを投げかけることができます.
"use strict";
var a = 010;
Uncaugt SyntxError:Octal literals are not alwed in strict mode.
g.prmitive値の設定を禁止する属性
厳密なモードではなく、属性設定の操作は無視されます.厳格なモードを採用すると、TypeErrエラーが発生します.prmitive値またはprmitiveデータタイプは対象ではなく、methodsがありません.JavaScriptには、6種類のprmitiveデータタイプがあります.string、number、bollan、null、undefined、smbol(ES 6)
"use strict";
false.true = '';
Uncaugt Type Error:Canot create property‘true’on bootlean‘false’
(2)変数の使用を簡略化する
コード内の変数名を変数定義にマッピングする方法を簡略化しました.コンパイラの最適化に有利です.
a.withの使用を禁止する.
withは、特定の対象のスコープ、すなわちwithブロック内のすべての変数を、着信対象の属性の中から優先的に検索し、再スコープ以外の場所を見つけることができません.
var a = 123;
var b = {a: 321};
with (b) {
    console.log(a); // 321
}
var d = {};
with (d) {
    console.log(a);// 123
}
withによる問題は、ブロック内の任意の名前がwith伝送されたオブジェクトの属性にマッピングされても良いし、このブロックを囲む作用領域内の変数、さらにはグローバル変数にマッピングされてもいいです.これはすべて実行時に決定されます.最適化のために、withを無効にしました.
"use strict";
var x = 1;
var obj = {x: 2};
with (obj) {
    console.log(x);
}
Uncaugt SyntxError:Strict mode code may not include a with statementの代わりにwithを作成する方法は、ターゲットオブジェクトを短い名前の変数に値を付けて、変数上の対応する属性にアクセスすることです.
b.厳格なモードでは、evalは上層範囲(surrounding scope、つまりevalコードブロックを囲む範囲)に新しい変数を導入しなくなります.
eval(string)は、ある文字列を計算し、JavaScriptコードを実行します.
c.厳格モードは宣言変数の削除を禁止します.
非厳格モード
var a = 1;
delete a;
console.log(a); // a = 1
厳格モード
"use strict";
var a = 1;
delete a;
Uncaugt SyntxError:Delete of an unqualified identifer in strict mode.
(3).evalとargmentsを簡単にする
a.名称evalとargmentsはプログラム文法によって結合されたり、値付けされたりすることができません.
"use strict";
eval = 17;
arguments ++;
Uncaugt SyntxError:Unxpected eval or argments in strict mode
b.厳格モードでは、パラメータの値はargmentsオブジェクトの値によって変化しません.
非厳格モードで
function f(a) {
    a = 42;
    return [a, arguments[0]];
}
var pair = f(17);
console.log(pair[0]); // 42
console.log(pair[1]);// 42
厳格モードで
function f(a) {
    "use strict";
    a = 42;
    return [a, arguments[0]];
}
var pair = f(17);
console.log(pair[0]); // 42
console.log(pair[1]);// 17
c.argments.caleeをサポートしません.
非厳格モードでは、argments.caleeは現在実行中の関数を指します.厳しいモードで:
"use strict";
function f() {
    return arguments.callee;
}
Uncaght Type Error:‘caler’,‘calee’,and‘argments’properties may not be accessed on strictions or the argments oject for calsto the m
(4)安全なJavaScript
a.厳格なモードでは、thisを介して関数の値に伝達され、強制的にオブジェクトに変換されません.thisが指定されていない場合、その値はundefinedです.
非厳格モード
function fun() {return this;}
console.log(fun()); // Window
console.log(fun().call(2)); // Number
console.log(fun().apply(null)); // Window
console.log(fun().call(undefined)); // Window
console.log(fun().bind(true)); // Boolean
厳格モード
"use strict";
function fun() {return this;}
console.log(fun()); // undefined
console.log(fun().call(2)); // 2
console.log(fun().apply(null)); // null
console.log(fun().call(undefined)); // undefined
console.log(fun().bind(true)); // true
b.厳格なモードでは、これ以上広範に実現されたECMAScriptを通じてJavaScriptスタックの中を泳いではいけない.
例えば、一つの関数funのfun.caller(最後の呼出funの関数に戻ります)は、fun.argmentsは削除できない属性です.そして、値を取る時と値を残す時にエラーが発生します.
非厳格モードで:
function b() {
    console.log(b.caller);
    console.log(b.arguments);
}
function a() {
    b();
}
a();
厳格なモードの下で:Uncaght Type Error:‘caler’and‘argments’artricted function properties and cannot be accessed in this context.
c.厳格なモードでは、アーグメンントは、この関数を呼び出すことに関連する変数にアクセスするルートを提供しません.
argments.callerオブジェクトは、格納された属性がその関数の変数を指します.argments.callerは削除できない属性です.そして、値を取る時と値を残す時にエラーが発生します.
非厳格モードで:
function fun(a, b) {
    var v = 2;
    return arguments.caller;
}
console.log(fun(1, 2)); // undefined
厳格モード:自分で試した結果は非厳格モードと同じで、文書とは違っています.なぜですか?
(5).未来のECMAScriptバージョンのために道路を舗装する
a.以下の単語は、厳格なモードでは変数名または形参として使用できません.
implements、interface、let、package、prvate、protected、public、static、yield
b.厳密モードは、スクリプトまたは関数レベルではない関数宣言を禁止しています.
非厳格モードでは、関数はどこでも宣言できます.たとえば:
var flag = true;
if (flag) {
    function change() {
        flag = false;
    }
    change();
}
厳しいモードでは、このようにすることは勧められません.
3.ブラウザの厳格モード
メインブラウザはすべて厳格なモードをサポートしていますが、大量のブラウザバージョンがあります.
4.その他
学習ドキュメント:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Strict_modeテストブラウザ:chrome(Verssion 60.0.3.32.113(Official Build)(64-bit)