Rumah >hujung hadapan web >tutorial js >Memahami mod ketat dalam petua javascript_javascript

Memahami mod ketat dalam petua javascript_javascript

WBOY
WBOYasal
2016-05-16 15:16:541970semak imbas

1. Apakah mod ketat
Kod JavaScript yang biasanya kami tulis biasanya berjalan dalam mod biasa Sebagai tambahan kepada mod larian biasa, ECMAscript 5 menambah mod larian kedua: "mod ketat". Seperti yang anda boleh ketahui daripada namanya, mod ini akan menjadikan JavaScript berjalan dalam persekitaran yang lebih ketat.
Pelayar utama, termasuk IE 10, sudah pun menyokongnya, dan banyak projek besar telah mula menerimanya sepenuhnya. (Banyak projek di github menggunakan mod ketat)
2. Dayakan mod ketat
Dayakan mod ketat untuk keseluruhan skrip
Letakkan pernyataan khusus "gunakan ketat";
sebelum semua pernyataan Katakan terdapat skrip reeoo.js, anda boleh menghidupkan mod ketat seperti ini:

"use strict";
var name = "Reeoo";
console.log(name);

Terdapat perangkap semula jadi dalam cara penulisan ini TETAPI Jika kita ingin menggabungkan kod, saya kini akan menggabungkan heigui.js:

heigui = "db";

Bercantum dengan reeoo.js Adalah baik untuk kedua-dua skrip dilaksanakan secara berasingan, tetapi ralat akan dilaporkan apabila digabungkan.
Ralat Rujukan Tidak Ditangkap: heigui tidak ditakrifkan(…)
Penggabungan skrip mod ketat dan skrip mod tidak ketat boleh menyebabkan kod skrip mod tidak ketat melaporkan ralat Adalah disyorkan bahawa kod itu dibalut dengan fungsi pelaksanaan segera.

(function(){
 "use strict";
 var name = "reeoo";
})();

(function(){
 heigui = "db";
})();

Dengan cara ini, tiada ralat akan dilaporkan selepas digabungkan.
Dayakan mod ketat untuk fungsi
Untuk mendayakan mod ketat untuk fungsi, letakkan sahaja pernyataan "guna ketat" sebelum semua pernyataan dalam badan fungsi.

function strictFun()
{
 // 函数级别严格模式语法
 'use strict';
 console.log('I am a strictmode function!');
}

function normalFun() { 
 console.log('I am a mormal function!');
}

Menyahpepijat mod ketat dalam Chrome
Saya mempunyai sekeping kod ini:

'use strict'
name = "reeoo";
console.log(name)

Tampal kod ini terus ke dalam konsol Chrome dan laksanakannya Dalam keadaan biasa, ralat harus dilaporkan, tetapi tiada ralat dilaporkan


Jelas sekali, dalam mod ketat, pembolehubah diisytiharkan tanpa var adalah haram, tetapi mengapa tiada ralat dilaporkan?
Apakah ini? Adakah Chrome tidak menyokong mod ketat? kelakar sungguh. . .
Selepas mencari dalam talian, ternyata kod konsol Chrome berjalan dalam eval, dan anda tidak boleh menggunakan mod ketat untuk fungsi eval (ia mungkin tidak betul sepenuhnya, tetapi apa sebenarnya yang Chrome lakukan tidak diketahui), seperti yang ditunjukkan di bawah Terangkan bahawa fungsi eval boleh menggunakan mod ketat:

Untuk melaporkan ralat dengan betul dalam mod ketat dalam penyemak imbas Chrome, anda perlu membalut fungsi pelaksanaan segera di luar kod atau langkah lain yang serupa.

(function(){
 'use strict'
 name = "reeoo";
 console.log(name) 
})()

Itu sahaja
Mod ketat penyahpepijatan kertas conteng kod FireFox
Chrome memerlukan kami memasukkan lapisan penutupan untuk menjalankan mod ketat Memandangkan ia sangat menyusahkan, adakah terdapat cara lain untuk menjalankan kod mod ketat secara terus?
FireFox mempunyai kertas conteng kod yang boleh anda jalankan terus Kekunci pintasan ialah SHIFT F4

Betapa ketatnya mod ketat
Beberapa had penting dalam mod ketat

1. Pengisytiharan boleh ubah
Menggunakan pembolehubah yang tidak diisytiharkan adalah tidak dibenarkan

"use strict";
name = "reeoo";

Pelaporan ralat (kertas draf kod, perkara yang sama di bawah)
Pengecualian: ReferenceError: penugasan kepada nama pembolehubah yang tidak diisytiharkan

2 Ubah suai nilai atribut baca sahaja

"use strict";
var testObj = Object.defineProperties({}, {
 prop1: {
 value: 10,
 writable: false // 一个只读的属性
 },
 prop2: {
 get: function () {
 }
 }
});
testObj.prop1 = 20; //尝试改变prop1的值
testObj.prop2 = 30;//尝试改变prop2的值

Ralat akan dilaporkan dalam mod ketat:
Uncaught TypeError: Tidak boleh menetapkan untuk membaca hanya sifat 'prop1' #a87fdacec66f0909fc0757c19f2d2b1d
Mod yang paling tidak ketat bermakna nilai tidak boleh diberikan dan tiada ralat akan dilaporkan

3. Ubah suai atribut yang tidak boleh dikembangkan
berkelakuan seperti menambahkan sifat pada objek dengan sifat boleh lanjut ditetapkan kepada palsu.

"use strict";
var testObj = new Object();
Object.preventExtensions(testObj);//经过这个方法处理过的对象,不影响原有对象的删除,修改.但是无法添加新的属性成员了.
testObj.name = "reeoo";

Ralat mod ketat:
Uncaught TypeError: Tidak boleh menambah nama harta, objek tidak boleh dipanjangkan
Mod tidak ketat tidak akan melaporkan ralat, tetapi testObj tidak akan dikembangkan.
4. Padamkan pembolehubah, fungsi atau parameter
Alih keluar sifat dengan atribut boleh dikonfigurasikan ditetapkan kepada palsu.

"use strict";
var testvar = 15,testObj={};
function testFunc() {};
delete testvar;
delete testFunc;

Object.defineProperty(testObj, "testvar", {
 value: 10,
 configurable: false
 });
delete testObj.testvar;

报错:
Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.

5、在一个对象文本中多次定义某个属性
严格模式下不允许一个属性有多个定义

"use strict";
var testObj = {
 prop1: 10,
 prop2: 15,
 prop1: 20
};

报错(node控制台)
Duplicate data property in object literal not allowed in strict mode
正常模式中后声明的重复的变量会覆盖前面声明的,而且不会报错。
注:这个问题在ECMAScript6中已被修复。

6、严格模式下不允许形参参数名称重复

"use strict";
function testFunc(param1, param1) {
 return 1;
};

报错:
Uncaught SyntaxError: Duplicate parameter name not allowed in this context

7、无法使用标识符的未来保留字。严格模式下将保留标识符名称
一下标识符(ES6中依然没有实现的)在严格模式中是不能使用的,否则也会报错。
用了就是这个下场:
Uncaught SyntaxError: Unexpected strict mode reserved word

  • implements
  • interface
  • package
  • private
  • protected
  • public
  • static
  • yield

8、严格模式下不允许使用八进制数字参数和转义字符

"use strict";
var testoctal = 010;
var testescape = \010;

报错:
Uncaught SyntaxError: Unexpected token ILLEGAL(…)
9、当this 的值为 null 或 undefined 时,该值不会转换为全局对象
比如:

"use strict";
function testFunc() {
 return this;
}
var testvar = testFunc();

在非严格模式下,testvar 的值为全局对象window,但在严格模式下,该值为 undefined。

10、字符串"eval"不能用作标识符(变量或函数名、参数名等)

"use strict";
var eval = "hehe";

Uncaught SyntaxError: Unexpected eval or arguments in strict mode

11、在严格模式下,函数声明无法嵌套在语句或块中。它们只能显示在顶级或直接显示在函数体中

"use strict";
var arr = [1, 2, 3, 4, 5];
var index = null;
for (index in arr) {
 function myFunc() {};
}

node控制台:
SyntaxError: In strict mode code, functions can only be declared at top level or immediately within another function.
但是这个限制已经在ES6中被修复
12、严格模式下eval用法无效
如果在 eval 函数内声明变量,则不能在此函数外部使用该变量。

"use strict";
eval("var testvar = 10");
console.log(testvars);

Uncaught ReferenceError: testvar is not defined

13、严格模式下"arguments"用法无效
字符串”arguments”不能用作标识符(变量或函数名、参数名等)。

"use strict";
var arguments = 1;

Uncaught SyntaxError: Unexpected eval or arguments in strict mode

这个跟上面第10条的限制是差不多的。
14、函数内的 arguments,无法更改arguments 对象的成员的值

"use strict";
function testArgs(oneArg) {
 arguments[0] = 20;
}

在非严格模式下,可以通过更改 arguments[0] 的值来更改 oneArg 参数的值,从而使 oneArg 和 arguments[0] 的值都为 20。在严格模式下,更改 arguments[0] 的值不会影响 oneArg 的值,因为 arguments 对象只是一个本地副本。
15、不允许使用arguments.callee

"use strict";
function my(testInt) {
 if (testInt-- == 0)
 return;
 arguments.callee(testInt--);
}
my(100);

用了的下场就是这样:
Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them
16、不允许使用with

"use strict";
with (Math){
 x = cos(3);
 y = tan(7);
}

Uncaught SyntaxError: Strict mode code may not include a with statement
为什么要使用严格模式
既然这种模式这么多限制,我为什么还要用呢?闲得蛋疼吗?当然8是,
JavaScript作为一门一开始用于浏览器的脚本语言,容错性非常好,即使有时候你的代码写的不标准,也不会报错,但这有时候会变成代码隐患。开启了严格模式之后,JavaScript的一些不合理的不严谨的语法都会得到控制,让你能够更严谨的书写JavaScript代码,成为一个更好的程序员。严格模式是ES5时代的产物,ES2015已经在普及的路上,是时候使用严格模式了!

参考
  1. 严格模式
  2. 严格模式

原文:http://reeoo.me/archives/strictmode.html

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn