亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

理解javascript中的嚴格模式

2019-11-20 10:38:49
字體:
來源:轉載
供稿:網友

一、什么是嚴格模式
我們平時寫的JavaScript代碼一般都運行在正常模式中的,除了正常運行模式,ECMAscript 5添加了第二種運行模式:”嚴格模式”(strict mode)??疵志椭溃@種模式會讓JavaScript在更嚴格的環境中運行。
包括IE 10在內的主流瀏覽器,都已經支持它,許多大項目已經開始全面擁抱。(github上面好多項目都是用的嚴格模式)
二、啟用嚴格模式
為整個腳本啟用嚴格模式
在所有語句之前放一個特定語句 "use strict";
假設有一個腳本reeoo.js,可以這樣開啟嚴格模式:

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

BUT這種寫法存在天然的坑,假如我們要做代碼合并,我現在要把heigui.js:

heigui = "db";

和reeoo.js進行合并,本來兩個腳本分開執行是好好的,合起來就會報錯。
Uncaught ReferenceError: heigui is not defined(…)
一個嚴格模式的腳本和一個非嚴格模式的腳本合并可能會導致非嚴格模式的腳本代碼報錯,建議代碼都包在一個立即執行函數里面。

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

這樣合并之后就不會報錯了。
為某個函數啟用嚴格模式
要給某個函數開啟嚴格模式,得把"use strict"; 聲明放在函數體所有語句之前就行了。

function strictFun(){ // 函數級別嚴格模式語法 'use strict'; console.log('I am a strictmode function!');}function normalFun() {  console.log('I am a mormal function!');}

Chrome中調試嚴格模式
我有這么一段代碼:

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

把這段代碼直接粘貼到Chrome的控制臺中執行,正常情況下應該報錯,但是并沒有報錯,


很顯然,嚴格模式下變量不適用var聲明是不合法的,但是為什么沒有報錯?
這是什么鬼,難道Chrome不支持嚴格模式?開什么玩笑。。。
網上搜了一下,原來Chrome的控制臺的代碼是運行在eval之中的,你沒法對eval函數使用嚴格模式(應該也不完全對,但是具體Chrome做了什么,不得而知),下圖說明eval函數可以使用嚴格模式:

要想在Chrome瀏覽器中對嚴格模式正常報錯,需要在代碼外層套一個立即執行函數,或者其它類似的措施。

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

這樣就可以了
FireFox代碼草稿紙調試嚴格模式
Chrome非要我們包一層閉包才能跑嚴格模式,既然這么麻煩,有沒有別的方式可以直接跑嚴格模式的代碼呢?
FireFox有一個代碼草稿紙可以直接跑,快捷鍵SHIFT+F4

嚴格模式到底有多嚴格
嚴格模式中一些重要的限制

1、變量聲明
不允許使用一個沒有聲明的變量

"use strict";name = "reeoo";

報錯(代碼草稿紙,下同)
Exception: ReferenceError: assignment to undeclared variable name

2、修改只讀屬性的值

"use strict";var testObj = Object.defineProperties({}, { prop1: { value: 10, writable: false // 一個只讀的屬性 }, prop2: { get: function () { } }});testObj.prop1 = 20; //嘗試改變prop1的值testObj.prop2 = 30;//嘗試改變prop2的值

嚴格模式下會報錯:
Uncaught TypeError: Cannot assign to read only property 'prop1' of #<Object>
非嚴格模式頂多就是值賦不上去而已,并不會報錯

3、修改不可擴展的屬性
表現為將屬性添加到 extensible 屬性設置為 false 的對象。

"use strict";var testObj = new Object();Object.preventExtensions(testObj);//經過這個方法處理過的對象,不影響原有對象的刪除,修改.但是無法添加新的屬性成員了.testObj.name = "reeoo";

嚴格模式報錯:
Uncaught TypeError: Can't add property name, object is not extensible
非嚴格模式不會報錯,但是testObj也不會被擴展。
4、刪除變量、函數或參數
刪除 configurable 特性設置為 false 的屬性。

"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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲www在线观看| 永久免费看mv网站入口亚洲| 色综合久久中文字幕综合网小说| 国产福利精品av综合导导航| 日韩免费av片在线观看| 91av在线播放视频| 成人两性免费视频| 亚洲美女精品成人在线视频| 欧美国产日产韩国视频| 97视频在线观看成人| 精品日韩视频在线观看| www.久久久久久.com| 亚洲天堂久久av| 欧美日韩综合视频| 曰本色欧美视频在线| 性色av一区二区三区红粉影视| 国内精品久久久久影院优| 欧美高清第一页| 亚洲综合中文字幕68页| 精品日本美女福利在线观看| 中文字幕日韩欧美精品在线观看| 最新国产精品拍自在线播放| 高清日韩电视剧大全免费播放在线观看| 亚洲影院色无极综合| 美女少妇精品视频| 中文字幕久热精品视频在线| 精品久久久久久中文字幕| 日本久久久久亚洲中字幕| 亚洲国产日韩欧美综合久久| 欧美精品久久久久久久| 欧美日韩第一页| 国产午夜精品免费一区二区三区| 中文字幕v亚洲ⅴv天堂| 久久久www成人免费精品张筱雨| 国产精品久久综合av爱欲tv| 国产亚洲精品成人av久久ww| 亚洲国产成人久久综合一区| 日本中文字幕久久看| 在线电影av不卡网址| 97成人在线视频| 欧美性xxxx极品高清hd直播| 亚洲综合av影视| 欧美视频在线观看 亚洲欧| 国产精品日本精品| 亚洲精品免费av| 国产精品久久久久国产a级| 欧美精品在线第一页| 成人黄色片网站| 亚洲国模精品一区| 亚州精品天堂中文字幕| 久久精品国产清自在天天线| 成人写真视频福利网| 久久久久久尹人网香蕉| 日韩欧美国产骚| 亚洲人成网站在线播| 欧美激情va永久在线播放| 91国产精品视频在线| 欧美日韩视频免费播放| 亚洲人成电影网站| 亚洲日本aⅴ片在线观看香蕉| 中文亚洲视频在线| 91美女片黄在线观| 国产成人精品最新| 午夜精品在线视频| 亚洲精品国产拍免费91在线| 日本久久久久久久久| 国语自产精品视频在线看抢先版图片| 日韩欧美在线播放| 成人妇女免费播放久久久| 亚洲视频在线观看视频| 大荫蒂欧美视频另类xxxx| 国产伊人精品在线| 国产精品三级久久久久久电影| 国产精品99免视看9| 久久影视免费观看| 亚洲精品自拍偷拍| 成人中心免费视频| 91午夜理伦私人影院| 国语自产精品视频在线看一大j8| 国产精品久久久久高潮| 久久综合免费视频| 日韩在线免费视频观看| 69久久夜色精品国产69| 美日韩精品免费观看视频| 97精品国产97久久久久久免费| 欧美精品在线观看| 国产精品成人久久久久| 国产精品成人一区二区| 在线观看久久久久久| 亚洲成色www8888| 精品国产一区二区三区久久久| 亚洲成年人影院在线| 亚洲精品videossex少妇| 91久久国产精品91久久性色| 亚洲欧美激情另类校园| 欧美另类老女人| 日韩**中文字幕毛片| 色综合天天综合网国产成人网| 川上优av一区二区线观看| 黑人狂躁日本妞一区二区三区| 久久久久北条麻妃免费看| 国产中文欧美精品| 欧美性xxxxx| 中文字幕欧美日韩| 91免费高清视频| 亚洲精品久久久久久久久久久| 国产视频自拍一区| 亚洲一区二区久久久| 日韩av一区二区在线观看| 中文字幕亚洲二区| 国产在线999| 国产精品电影一区| 欧美日本亚洲视频| 国产精品国内视频| 国产精品一区二区在线| 97国产精品免费视频| 日韩av在线一区| 日韩高清av一区二区三区| 亚洲精品永久免费精品| 欧美诱惑福利视频| 亚洲国语精品自产拍在线观看| 欧美一级片免费在线| 国产成人精品免费久久久久| 啊v视频在线一区二区三区| 亚洲免费中文字幕| 欧美精品18videos性欧美| 亚洲高清av在线| 欧美激情中文字幕在线| 91国内免费在线视频| 欧美第一黄色网| 久久精品国产v日韩v亚洲| 亚洲欧美国产制服动漫| 欧美性猛交xxxx乱大交3| 91精品中文在线| 日韩在线播放一区| 亚洲激情电影中文字幕| 久久久91精品国产一区不卡| 国产精品99久久久久久人| 国产噜噜噜噜噜久久久久久久久| 亚洲视频999| 国产91精品视频在线观看| 欧美孕妇毛茸茸xxxx| 欧美中文字幕在线播放| 日韩精品一二三四区| 成人国产在线视频| 日韩电影视频免费| 成人黄色av网| 麻豆成人在线看| 性色av一区二区三区在线观看| 青青久久av北条麻妃黑人| 欧美激情中文字幕乱码免费| xvideos亚洲人网站| 国产精品稀缺呦系列在线| 久久青草福利网站| 色吧影院999| 日日狠狠久久偷偷四色综合免费| 欧美大片欧美激情性色a∨久久| 亚洲无限乱码一二三四麻| 欧美激情视频给我| 久久久国产一区二区三区| 91日本在线视频| 一区二区欧美久久| 亚洲人成电影在线| 高清欧美性猛交xxxx黑人猛交|