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