摘要:之后,在瀏覽器大戰中,成為各方角逐的主要戰場。各大廠商各顯神通,其副作用是各種奇奇怪怪的行為和各式不一的。也就是說,有很多模棱兩可,或是錯誤卻被允許的操作,被徹底禁止了。目前支持嚴格模式的支持范圍從起跳,其他常青瀏覽器也都是支持的。
原文: http://pij.robinqu.me/JavaScript_Core/JavaScript_Basics/Strict_Mode.html
源代碼: https://github.com/RobinQu/Programing-In-Javascript/blob/master/chapters/JavaScript_Core/JavaScript_Basics/Strict_Mode.md
本文需要補充更多例子
本文存在批注,但該網站的Markdown編輯器不支持,所以無法正常展示,請到原文參考。
Strict Mode和Extended Mode本文上一個版本盜用了別人的文章,經讀者指出后我就刪掉了。由于起草的時間在去年,我也不太清楚當初是怎么把別人的文章復制進來的。本文除了介紹所謂的Strict Mode之外,還會介紹其他關聯內容。
JavaScript并不是一個完美的語言。事實上,第一個版本的Brendan Eich1花費十天的時間創造的,你不能對它期望太多。之后,JavaScript在瀏覽器大戰中,成為各方角逐的主要戰場。各大廠商各顯神通,其副作用是各種奇奇怪怪的行為和各式不一的API。在之后,W3C和其他社區團體花費了大量的精力來通過標準化來“凈化”所有Web開發相關的技術標準。
但尷尬的是,瀏覽器廠商并不是那么完全的實現了W3C和ECMAScript的各種標準。最后,經驗豐富的Javascript程序員,通過約束自身對Javascript的使用方法,來達到讓Javascript更高的可擁度??赡艽蟛糠秩硕甲x過《JavaScript語言精粹》2這本書,其講述的就是如何在JavaScript語言中,取其精華,然后去其糟粕。
而JavaScript的嚴格模式,則是另一種緊箍咒,它的約束力來自運行時本身,而不是用戶的主觀行為。也就是說,有很多模棱兩可,或是錯誤卻被允許的操作,被徹底禁止了。目前支持嚴格模式的支持范圍3從IE10起跳,其他常青瀏覽器也都是支持的。
如何開啟開啟全局模式只需在所有語句之前放置"use strict"字符串常量。
全局開啟嚴格模式:
"use strict" var v = "Hello world";
但注意,這樣會導致整個腳本內的代碼都在嚴格模式中執行。假如之前有些代碼并沒有考慮嚴格模式,這可能讓你的整個應用程序突然失效。
我們更為推薦的是,在某個函數內開啟嚴格模式:
function mySuperMethod() { "use strict"; var v = "Hello world"; } function mySuckingMethod { //not in strict mode }嚴格模式的具體行為
大家有需要記住一堆語言特性了。但是,還好這些內容是把“歪”的掰“直”了。有少數代碼例子來自于MDC4。
拋出ReferenceError
試圖隱式創建全局變量
``` "use strict" hello = "world"http://throw ```拋出TypeError
試圖修改已經被定義為不可寫的屬性
``` "use strict"; var o = {}; Object.defineProperty(o, "hello", {value:"world", wrtiable:false}); o.hello = "bad boy";//throw ```
其他類似的還有:
給只讀屬性賦值
給不可擴展的對象新建屬性
試圖刪除不可刪除的屬性
``` "use strict"; delete Object.prototype; //throw ```
arguments.callee不能被返回、刪除、修改;
``` "use strict"; var fun = function() { return arugments.callee;//throw }; ```拋出SyntaxError
重復定義屬性名
``` "use strict"; var o = {hello: 1, hello: 2};//throw ```
禁用八進制字面量
``` "use strict"; var hello = 015;//throw ```
不允許重復參數名
``` function myMethod(a, b, b) {//throw "use strict"; } ```
不能使用with
``` "use strict"; var obj = {}; with (obj) {};//throw ```
不允許對eval或arguments賦值
``` var fun = function(){ "use strict"; eval=16 }(); ```
不可將eval或arguments作為參數名、變量名
``` var fun = function(){ "use strict"; var obj = { set p(arguments) {} }; }(); ```eval被限制在臨時的本地作用域
eval不再有權限直接修改其所在作用于,而只能影響自身創建的作用域。
var hello = "world"; var evalHello = eval(""use strict"; var hello = "girl"; hello"); // hello === "world" // evalHello === "girl"arguments不再追蹤實際參數值變化
function f(hello) { "use strict"; hello = "girl"; return [hello, arguments[0]]; } var pair = f("world"); // pair[0] === "girl" // pair[1] === "world";函數的動態綁定后的this不做任何修改
即使指定null或undefined,引擎也不會重新指定全局對象作為this
指定基礎數據類型時,也不會用包裝類進行轉換
"use strict"; function fun() { return this; } // fun() === undefined // fun.call(2) === 2 // fun.apply(null) === null // fun.call(undefined) === undefined // fun.bind(true)() === true調用堆棧不可被追蹤
以往,我們可以通過函數的caller和arguments來投影整個調用堆棧。但是,在嚴格模式中我們做不到。
function restricted() { "use strict"; restricted.caller; // throws a TypeError restricted.arguments; // throws a TypeError }ECMAScript6的相關特性 更多保留字
implements, interface, let, package, private, protected, public, static, yield僅允許在開頭使用function語句
很多開發者喜歡如下代碼風格,這在嚴格模式中會報錯。
function foo() { "use strict"; return g; function g() { }//throw SyntaxError }
這個改變的原因是,JavaScript的Hoisting特性會讓很多人迷惑:
function g() { } function foo() { if (true) function g() { } return g; }Extended Mode
ES6 Draft中引入了一個新的概念5,叫Extend Mode,然后又被撤銷了6。但不幸的是,V8中已經支持了這個新模式。所以,作為事實標準,目前依賴V8的所有Javascript運行環境都有如下三個模式:
Classic Mode,或者Non-strict mode
Strict Mode
Extended Mode
這個模式是備受爭議的。這個模式的產生,也體會出制作一個標準的困難之處——你總要考慮新標準對老標準的兼容,尤其是Web技術。
有稍微了解ES6的同學都應該清楚,module、class這些東西已經完全顛覆了傳統JavaScript的很多嘗試。但也有不少東西,開發者是可以接受,并立馬去嘗試的。于是乎,關于如何讓代碼部分進入extended mode也就成了最初討論的重點7。
實際表現上,node的0.11.x的版本,有些特性,僅僅使用--harmony并不能完全使用,還需加上--use_strict。在這里,已經可以看出V8團隊有多糾結了8。他們也沒有想清楚,該如何進入extended mode,索性,也叫strict吧。
目前僅在extended mode下可用的ES6特性:
let
blockl-level function declaration
關于ES6的特性,請參考本書的相關章節。
http://en.wikipedia.org/wiki/Brendan_Eich??
http://book.douban.com/subject/3590768/??
http://caniuse.com/#feat=use-strict??
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Strict_mode??
http://wiki.ecmascript.org/doku.php?id=harmony:specification_drafts??
http://wiki.ecmascript.org/lib/exe/fetch.php?id=harmony%3Aspecification_drafts&cache=cache&media=harmony:working_draft_ecma-262_edition_6_11-7-11.pdf??
https://lists.webkit.org/pipermail/webkit-dev/2011-December/018903.html??
https://code.google.com/p/v8/source/detail?r=10062??
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/78152.html
原文: http://pij.robinqu.me/Javascript_Core/Javascript_Basics/Strict_Mode.html 源代碼: https://github.com/RobinQu/Programing-In-Javascript/blob/master/chapters/Javascript_Core/Javascript_Basics/Strict...
摘要:前三個是為了解決變量聲明定義的問題,而最后一個則影響最大。下文只介紹前三個特性。這是因為的的不支持塊級作用域,變量僅僅被限制到函數作用域內。 原文: http://pij.robinqu.me/JavaScript_Core/ECMAScript/es6/es6_syntax_features.html 源代碼: https://github.com/RobinQu/P...
摘要:前三個是為了解決變量聲明定義的問題,而最后一個則影響最大。下文只介紹前三個特性。這是因為的的不支持塊級作用域,變量僅僅被限制到函數作用域內。 原文: http://pij.robinqu.me/JavaScript_Core/ECMAScript/es6/es6_syntax_features.html 源代碼: https://github.com/RobinQu/P...
摘要:前三個是為了解決變量聲明定義的問題,而最后一個則影響最大。下文只介紹前三個特性。這是因為的的不支持塊級作用域,變量僅僅被限制到函數作用域內。 原文: http://pij.robinqu.me/JavaScript_Core/ECMAScript/es6/es6_syntax_features.html 源代碼: https://github.com/RobinQu/P...
摘要:字符串不能用作標識符變量或函數名參數名等在嚴格模式下,函數聲明無法嵌套在語句或塊中。嚴格模式下用法無效如果在函數內聲明變量,則不能在此函數外部使用該變量。在嚴格模式下,更改的值不會影響的值,因為對象只是一個本地副本。 本文同步自 我的博客,地址:http://reeoo.me/archives/strictmode.html 什么是嚴格模式 我們平時寫的JavaScript代碼一般都運...
閱讀 3549·2019-08-30 12:58
閱讀 930·2019-08-29 16:37
閱讀 2803·2019-08-29 16:29
閱讀 3108·2019-08-26 12:18
閱讀 2373·2019-08-26 11:59
閱讀 3418·2019-08-23 18:27
閱讀 2790·2019-08-23 16:43
閱讀 3306·2019-08-23 15:23