严格模式详解
1.嚴(yán)格模式的好處
1.1消除javascript不合理、不嚴(yán)謹(jǐn)之處,減少怪異行為
1.2消除代碼的不安全之處,保證代碼的安全運(yùn)行
1.3提高編譯器的效率,增加運(yùn)行速度
1.4為后續(xù)版本的javascript做鋪墊
2.嚴(yán)格模式的進(jìn)入標(biāo)準(zhǔn)
2.1"use strict"(老版本不支持將會(huì)忽略,變?yōu)椴煌J?
3.如何調(diào)用
3.1整個(gè)腳本的調(diào)用
放在腳本的第一行將是整個(gè)腳本都是嚴(yán)格模式,不在第一行則無效,所以如果多個(gè)嚴(yán)格模式的文件合并時(shí)要注意
1 <script>
2 "use strict";//放在腳本的第一行將是整個(gè)腳本都是,不在第一行則無效
3 console.log("這是嚴(yán)格模式");
4 </script>
3.2單個(gè)函數(shù)的調(diào)用
1 <script>
2 (function(){
3 "use strict"
4 console.log("這是單個(gè)函數(shù)的調(diào)用");
5 })()
6 </script>
4.語法和行為的改變
4.1禁止使用沒有聲明的變量(在普通模式中沒有聲明就賦值的變量默認(rèn)是全局變量);
1 <script>
2 v = 3;//報(bào)錯(cuò),v沒有聲明
3 for(i=0;i<5;i++){}//報(bào)錯(cuò),i沒有聲明
4 </script>
4.2靜態(tài)綁定
javascript是允許"動(dòng)態(tài)綁定",即某些屬性和方法到底是屬于那個(gè)對(duì)象,不是在編譯時(shí)確定的而是在運(yùn)行的時(shí)候確定的,而嚴(yán)格模式是不允許"動(dòng)態(tài)綁定"的,也就是說在編譯的時(shí)候就確定了屬性和方法是屬于哪個(gè)對(duì)象,
好處(這樣有利于提高編譯效率,代碼也更容易閱讀,更少出意外);
4.2.1禁止使用with
1 var col = {
2 v:4,
3 l:5
4 }
5 with(col){//with為語句指定特定的對(duì)象,嚴(yán)格模式下不能使用with,because無法在編譯時(shí)確定屬性到底屬于哪個(gè)對(duì)象
6 console.log(v);//普通模式下值為4
7 }
4.2.2創(chuàng)建eval作用域
1 var v = 1;
2 console.log(eval("var v = 5; v;"));//在嚴(yán)格模式下eval本身就是一個(gè)作用域,不能再生成全局變量了
3 console.log(v);
4 //嚴(yán)格模式下輸出5;1
5 //普通模式下輸出5;5
5.增強(qiáng)安全措施
5.1禁止this指向全局變量
1 (function foo(){
2 "use strict"
3 console.log("show this:"+(this));//嚴(yán)格模式下禁止this指向全局變量,使用this會(huì)是undefined;
4 })();
5
6
7 function aa(){
8 "use strict"
9 this.a = 1;
10 }
11 aa(); //直接調(diào)用aa()會(huì)報(bào)錯(cuò),應(yīng)為此時(shí)的this是undefined
12 var bb = new aa();//this對(duì)象引用bb對(duì)象,還繼承了該函數(shù)的原型
13 console.log(bb.a);//返回的是1;
6.禁止刪除變量
嚴(yán)格模式下無法刪除變量。只有configurable設(shè)置為true的對(duì)象屬性,才能被刪除。
1 "use strict";
2
3 var x;
4
5 delete x; // 語法錯(cuò)誤
6
7 var o = Object.create(null, 'x', {
8 value: 1,
9 configurable: true
10 });
7.重名錯(cuò)誤
7.1對(duì)象不能有重名屬性
1 (function(){
2 "use strict"
3 var obj = {
4 p:1,
5 p:2
6 }
7 console.log(obj.p);//在高版本的瀏覽器中是可以顯示2的,在低版本中會(huì)報(bào)錯(cuò)
8 })();
7.2函數(shù)不能有重名參數(shù)
1 function f(a,a,b){
2 "use strict"
3 a = 2;
4 return [a,arguments[0]];
5 }//Duplicate parameter name not allowed in this context
8.函數(shù)必須聲明在頂層(然而我運(yùn)行后是沒有報(bào)錯(cuò)的,是現(xiàn)在的瀏覽器都支持了么)
將來Javascript的新版本會(huì)引入"塊級(jí)作用域"。為了與新版本接軌,嚴(yán)格模式只允許在全局作用域或函數(shù)作用域的頂層聲明函數(shù)。也就是說,不允許在非函數(shù)的代碼塊內(nèi)聲明函數(shù)。
1 "use strict";
2
3 if (true) {
4
5 function f() { } // 語法錯(cuò)誤
6
7 }
8
9 for (var i = 0; i < 5; i++) {
10
11 function f2() { } // 語法錯(cuò)誤
12
13 }
9.保留字
為了向?qū)鞪avascript的新版本過渡,嚴(yán)格模式新增了一些保留字:implements, interface, let, package, private, protected, public, static, yield。
使用這些詞作為變量名將會(huì)報(bào)錯(cuò)。
1 function package(protected) { // 語法錯(cuò)誤
2
3 "use strict";
4
5 var implements; // 語法錯(cuò)誤
6
7 }
這是寶寶看到別人的文章后自己實(shí)踐了一下發(fā)現(xiàn)有些問題,就自己半應(yīng)用半用自己的實(shí)踐結(jié)果的總結(jié),還有一些其他的自己沒有用到就沒有寫
http://www.cnblogs.com/ranzige/p/3564113.html參考地址
總結(jié)
- 上一篇: 如何进行需求测试/需求评审
- 下一篇: Win10数字权利永久激活神器—HWID