ES5嚴(yán)格模式

除了正常運行模式的猛,ECMAscript 5添加了第二種運行模式:"嚴(yán)格模式"(strict mode)。顧名思義,這種模式使得Javascript在更嚴(yán)格的條件下運行徙垫。

為什么提出嚴(yán)格模式

  1. 消除Javascript語法的一些不合理饺汹、不嚴(yán)謹(jǐn)之處蛔添,減少一些怪異行為;
  2. 消除代碼運行的一些不安全之處,保證代碼運行的安全兜辞;
  3. 提高編譯器效率迎瞧,增加運行速度;
  4. 為未來新版本的Javascript做好鋪墊逸吵。

"嚴(yán)格模式"體現(xiàn)了Javascript更合理凶硅、更安全、更嚴(yán)謹(jǐn)?shù)陌l(fā)展方向扫皱,包括IE 10在內(nèi)的主流瀏覽器足绅,都已經(jīng)支持它捷绑,許多大項目已經(jīng)開始全面擁抱它。
另一方面氢妈,同樣的代碼粹污,在"嚴(yán)格模式"中,可能會有不一樣的運行結(jié)果首量;一些在"正常模式"下可以運行的語句壮吩,在"嚴(yán)格模式"下將不能運行。所以有必要知道里面具體有哪些要求加缘!

首先鸭叙,如何啟用嚴(yán)格模式

使用use strict這條語句即可

<script>
  "use strict";
  console.log("這是嚴(yán)格模式。");
</script>

需要注意的是拣宏,嚴(yán)格模式的聲明必須放在腳本的第一行沈贝,否則整個腳本將會以正常模式運行。

除了這種全局的嚴(yán)格模式勋乾,還可以聲明在函數(shù)里面宋下,即局部的嚴(yán)格模式,很多時候局部的嚴(yán)格模式還比較常見市俊。
注意:在函數(shù)里面聲明嚴(yán)格模式杨凑,嚴(yán)格模式只對此函數(shù)內(nèi)的代碼起作用

function strict(){
  "use strict";
  return "這是嚴(yán)格模式。";
}
function notStrict() {
  return "這是正常模式摆昧。";
}

接下來我們一一介紹嚴(yán)格模式都做了哪些規(guī)范:

  1. 變量必須先聲明后使用
    不存在暗示全局變量這種東西了
<script>
  "use strict";
  a = 1; //報錯
</script>
  1. 函數(shù)參數(shù)不能有同名屬性撩满,否則報錯
    正常模式下,如果函數(shù)有多個重名的參數(shù)绅你,可以用arguments[i]讀取伺帘。嚴(yán)格模式下,這屬于語法錯誤忌锯。
"use strict";
function f(a, a, b) { // 語法錯誤
    return ;
}
  1. 不能使用with
    with用于改變代碼塊內(nèi)的的作用域伪嫁,將其設(shè)置為某個對象
function Lakers() {
    this.name = "kobe bryant";
    this.age = "28";
    this.gender = "boy";
}
var people=new Lakers();
with(people){
    var str = "姓名: " + name + "<br>";  //直接使用了people對象中的name屬性
    str += "年齡:" + age + "<br>";
    str += "性別:" + gender;
    document.write(str); 
}
  1. 不能使用arguments.callee
    callee是arguments的一個屬性,用于返回正在執(zhí)行的函數(shù)本身的引用
function fn(num){
  if(num<=1){
    return 1;
  }else{
    return num*arguments.callee(num-1);
  }
 }
  1. 不能使用fn.caller和fn.arguments獲取函數(shù)調(diào)用的堆棧
    caller是函數(shù)上面的一個屬性偶垮,保存著調(diào)用當(dāng)前的函數(shù)的函數(shù)引用张咳,如果是全局作用于中調(diào)用當(dāng)前的函數(shù)就返回null
function testFunc() {
  'use strict';
  console.log(testFunc.caller);  //Uncaught TypeError: ...
  console.log(testFunc.arguments); //Uncaught TypeError: ...
} 
function main() {
  testFunc();
} 
main();
  1. 新增一些保留字
    ES5本質(zhì)上來講只是一個語言優(yōu)化的過渡,約束了晦澀和不安全的語法似舵,為以后的高級語法鋪平道路脚猾。所以在ES5中新增了一些保留字,嚴(yán)格模式下砚哗,不能使用他們作為變量名或參數(shù)名龙助,包括:
    implements, interface, let, package, private, protected, public, static, yield
  2. 禁止this指向全局對象
    在嚴(yán)格模式中,this不被允許指向全局蛛芥,如果運行時試圖指向全局提鸟,this將會變?yōu)閡ndefined
'use strict'; 
var func = function() {
  return this;
}; 
console.log(func() === undefined);  //true
  1. arguments不再追蹤參數(shù)變化
    常規(guī)模式下军援,在執(zhí)行函數(shù)時如果我們更改參數(shù)的值,操作結(jié)果會立即映射到arguments對象中称勋,更改arguments對象中的值胸哥,也會立即映射到參數(shù)上!
    嚴(yán)格模式約束了這種行為铣缠,將arguments對象與參數(shù)分離烘嘱,更改只會影響自己昆禽,不會對彼此都產(chǎn)生影響
'use strict';
var fn = function(a, b, c) {
  a = 10;
  console.log(arguments[0]); // 1
  
  arguments[1] = 20;
  console.log(b);            // 2
};
 
fn(1, 2, 3);
  1. eval不會在它的外層作用域引入變量(強制為eval創(chuàng)建新作用域)
    常規(guī)模式下蝗蛙,使用eval函數(shù)可能會影響當(dāng)前作用域或全局作用域,給程序的運行結(jié)果帶來不確定性醉鳖,嚴(yán)格模式為JavaScript程序創(chuàng)建了第三種作用域:eval作用域捡硅。eval函數(shù)中的字符串只能在eval作用域內(nèi)運行,所以嚴(yán)格模式下執(zhí)行eval函數(shù)不會對當(dāng)前作用域產(chǎn)生作用
'use strict';
eval("var a = 1;");
console.log(a); //Uncaught ReferenceError: a is not defined
 
//or
 
eval("'use strict'; var b = 3;");
console.log(b); //Uncaught ReferenceError: b is not defined
  1. eval和arguments不能被重新賦值
    常規(guī)模式下的JavaScript的隨意性較大盗棵,eval和arguments可以有很多稀奇古怪的用法壮韭,程序雖然可以運行,但這給代碼的可讀性纹因、可維護性也帶來了一些問題喷屋。所以嚴(yán)格模式禁止對eval和arguments做非法操作
  2. 禁止使用前綴數(shù)字零:0表示八進制數(shù),否則報錯
    非嚴(yán)格模式下:
var num1=070;        //八進制的56
var num2=079;        //無效的八進制數(shù)值瞭恰,解析為79
var num3=08;        //無效的八進制數(shù)值屯曹,解析為8

另外,ES6已經(jīng)支持新的語法標(biāo)準(zhǔn)惊畏,八進制以0o來表示恶耽,這樣一來就與16進制的0x形成統(tǒng)一的語法格式:

'use strict';
var a = 017;  //Uncaught SyntaxError: ... 
var b = 0o17; //ES6 Octal syntax: 8 + 7 = 15
  1. 禁止對象屬性重名
    非嚴(yán)格模式重復(fù)的屬性,后定義的會覆蓋先定義的颜启。嚴(yán)格模式下會報錯

  2. 函數(shù)必須聲明在整個腳本或函數(shù)層面
    嚴(yán)格模式禁止在語句塊中聲明函數(shù)偷俭,因為當(dāng)調(diào)用該函數(shù)是,會報錯缰盏。

'use strict';
if (true) {
  function doSomething() {
    console.log('1');
  }
} else {
  function doSomething() {
    console.log('2');
  }
}
 
for (var i = 0; i < 5; i++) {
  function doSomething() {
    console.log('3');
  }
}
 
doSomething();  //Uncaught ReferenceError: doSomething is not defined
  1. 不能刪除變量delete prop涌萤,會報錯,只能刪除屬性delete global[prop]
    這點視乎非嚴(yán)格模式也是這樣

參考文獻:
ES5規(guī)范之嚴(yán)格模式
嚴(yán)格模式(Strict mode)--w3cschool
附錄C:ECMAScript 的嚴(yán)格模式--w3cschool
ES5 規(guī)范之嚴(yán)格模式詳解
Javascript 嚴(yán)格模式use strict詳解
ES5嚴(yán)格模式
ES5嚴(yán)格模式--騰訊課堂渡一教育
JavaScript中with語句
callee和caller
在JavaScript中定義八進制數(shù)和十六進制數(shù)以及toString方法的一些用法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末口猜,一起剝皮案震驚了整個濱河市负溪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌暮的,老刑警劉巖笙以,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異冻辩,居然都是意外死亡猖腕,警方通過查閱死者的電腦和手機拆祈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來倘感,“玉大人放坏,你說我怎么就攤上這事±下辏” “怎么了淤年?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蜡豹。 經(jīng)常有香客問我麸粮,道長,這世上最難降的妖魔是什么镜廉? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任弄诲,我火速辦了婚禮,結(jié)果婚禮上娇唯,老公的妹妹穿的比我還像新娘齐遵。我一直安慰自己,他們只是感情好塔插,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布梗摇。 她就那樣靜靜地躺著,像睡著了一般想许。 火紅的嫁衣襯著肌膚如雪伶授。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天伸刃,我揣著相機與錄音谎砾,去河邊找鬼。 笑死捧颅,一個胖子當(dāng)著我的面吹牛景图,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播碉哑,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼挚币,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了扣典?” 一聲冷哼從身側(cè)響起妆毕,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贮尖,沒想到半個月后笛粘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年薪前,在試婚紗的時候發(fā)現(xiàn)自己被綠了润努。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡示括,死狀恐怖铺浇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情垛膝,我是刑警寧澤鳍侣,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站吼拥,受9級特大地震影響倚聚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜扔罪,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一秉沼、第九天 我趴在偏房一處隱蔽的房頂上張望桶雀。 院中可真熱鬧矿酵,春花似錦、人聲如沸矗积。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽棘捣。三九已至辜腺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間乍恐,已是汗流浹背评疗。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留茵烈,地道東北人百匆。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像呜投,于是被迫代替她去往敵國和親加匈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355