成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

嚴(yán)格模式和非嚴(yán)格模式區(qū)別

liaoyg8023 / 2094人閱讀

摘要:嚴(yán)格模式和非嚴(yán)格模式有什么區(qū)別嚴(yán)格模式對正常的語義做了一些更改。其次,嚴(yán)格模式修復(fù)了一些導(dǎo)致引擎難以執(zhí)行優(yōu)化的缺陷有時候,相同的代碼,嚴(yán)格模式可以比非嚴(yán)格模式下運行得更快。

嚴(yán)格模式和非嚴(yán)格模式有什么區(qū)別:

嚴(yán)格模式對正常的 JavaScript語義做了一些更改。
首先,嚴(yán)格模式通過拋出錯誤來消除了一些原有靜默錯誤。
其次,嚴(yán)格模式修復(fù)了一些導(dǎo)致 JavaScript引擎難以執(zhí)行優(yōu)化的缺陷:有時候,相同的代碼,嚴(yán)格模式可以比非嚴(yán)格模式下運行得更快。
第三,嚴(yán)格模式禁用了在ECMAScript的未來版本中可能會定義的一些語法。

上文引用了MDN對嚴(yán)格模式的描述

1.變量必須聲明才能使用(在正常模式中,如果一個變量沒有聲明就賦值,默認是全局變量。嚴(yán)格模式禁止這種寫法)

2.禁止使用with語句(因為with語句無法在編譯時就確定,屬性到底歸屬于哪個對象,嚴(yán)格模式有利于編譯效率提高)

3.創(chuàng)建eval作用域(正常模式下,js有兩種變量作用域,全局作用域和局部作用域,正常模式下eval語句作用域取決于它處于全局作用域還是函數(shù)作用域,嚴(yán)格模式下eval語句本身就是作用域,不能夠生成全局變量,所生成的變量只能用于eval內(nèi)部)

4.禁止this關(guān)鍵字指向全局對象(嚴(yán)格模式下全局作用域中定義的函數(shù)中的this為undefined)。例如:

 function f(){
   return !this; //返回的是false,因為this指向的是全局對象,!對象 == false
 }
 function f(){
   "use strict"
   return !this; //返回的是true,因為嚴(yán)格模式下,this的值為undefined,!undefined == true
 }

5.禁止在函數(shù)內(nèi)部遍歷調(diào)用棧( caller:調(diào)用當(dāng)前函數(shù)的函數(shù)的引用,即外層函數(shù)的引用; )

function f1(){
    "use strict";
    f1.caller; //報錯
    f1.arguments; //報錯
}
f1();

6.嚴(yán)格模式下無法刪除變量。只有conifgurable設(shè)置為true的對象屬性才能被刪除

"use strict"

var x ;

delete x; //嚴(yán)格模式下報語法錯誤

var o = Object.create(null,{"x":{

    value: 1,

    configurable: true

}})

delete o.x; //刪除成功

7.顯示報錯(正常模式下對一個對象的只讀屬性進行賦值,不會報錯,只會默默失敗。嚴(yán)格模式下將報錯)

"use strict";

var o = {};

Object.defineProperty(o,"v",{value: 1,writable: false});

o.v = 2; //報錯,因為o.v屬性是不能被修改的,嚴(yán)格模式會報錯,正常模式會失敗但不報錯

8.嚴(yán)格模式下,對禁止擴展的對象添加新屬性,會報錯

"use strict";

var o = {};

Object.preventExtensions(o);//禁止o對象有拓展屬性

o.v = 1; //報錯

9.嚴(yán)格模式下,刪除一個不可刪除的屬性,報錯

"use strict";
delete Object.prototype; //報錯

10.對象擁有多個同名屬性,嚴(yán)格模式報錯。正常模式會默認值為最后一個

11.函數(shù)不能有重名的參數(shù),嚴(yán)格模式會報錯,正常模式可以通過arguments[i]來獲取對應(yīng)的參數(shù)

12.禁止八進制寫法,正常情況下整數(shù)第一位為0代表八進制,嚴(yán)格模式下整數(shù)第一位為0則報錯

13.不準(zhǔn)對arguments賦值

14.嚴(yán)格模式下的arguments不在追蹤參數(shù)的變化

function fn(a){
    a=2;
    return [a,arguments[0]];
}
fn(1); //正常模式返回值 [2,2]
"use strict"
function fn(a){
    a = 2;
    return [a,arguments[0]];
}
fn(1); //嚴(yán)格模式返回值 [2,1] 參數(shù)傳進來是多少就是多少,arguments不會變化

15.禁止使用arguments.callee(無法在匿名函數(shù)內(nèi)部調(diào)用自身了。arguments.callee指向的就是該函數(shù)本身)

var f = function (){
    return arguments.callee;
}
f(); //報錯

總結(jié):推薦使用嚴(yán)格模式,因為能讓代碼更規(guī)范,也更利于后期的維護和排除錯誤。更加嚴(yán)謹(jǐn)。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/96337.html

相關(guān)文章

  • JavaScript中的this

    摘要:作為構(gòu)造函數(shù)何為構(gòu)造函數(shù)所謂構(gòu)造函數(shù)就是用來對象的函數(shù),像等都是全局定義的構(gòu)造函數(shù)。正在跑步正在說話正在跑步正在說話如上,如果函數(shù)作為構(gòu)造函數(shù)用,那么其中的就代表它即將出來的對象。 前言 總括:詳解JavaScript中的this的一篇總結(jié),不懂this這個難點,很多時候會造成一些困擾,寫出一些bug不知如何收場,所以一起來寫bug吧,不對,一起來寫代碼吧。 原文地址:JavaScr...

    SimpleTriangle 評論0 收藏0
  • Javascript權(quán)威指南--每日一讀(語句)

    摘要:和都是循環(huán)語句,不同的是檢測表達式的位置。語句異常語句,所謂異常語句是發(fā)生異?;蝈e誤的一個標(biāo)志或信號。拋出異常就是指這個狀況,捕獲異常實是指處理的過程。語句異常處理機制。語句嚴(yán)格模式中禁止使用語句。 1.switch語句 語句都很熟悉的啦,只是提一句。switch中的case語句匹配的規(guī)則實際上是===而非簡單的==比較,case匹配不會做任何的類型轉(zhuǎn)換的。 2.while和do/wh...

    CastlePeaK 評論0 收藏0
  • 論普通函數(shù)和箭頭函數(shù)的區(qū)別以及箭頭函數(shù)的注意事項、不適用場景

    摘要:第二種情況是箭頭函數(shù)的如果指向普通函數(shù)它的繼承于該普通函數(shù)。箭頭函數(shù)的指向全局,使用會報未聲明的錯誤。 showImg(https://segmentfault.com/img/remote/1460000018610072?w=600&h=400); 箭頭函數(shù)是ES6的API,相信很多人都知道,因為其語法上相對于普通函數(shù)更簡潔,深受大家的喜愛。就是這種我們?nèi)粘i_發(fā)中一直在使用的API...

    paulquei 評論0 收藏0
  • JavaScript之“use strict”

    摘要:在嚴(yán)格模式中,當(dāng)運算符后跟隨非法的標(biāo)識符比如變量函數(shù)函數(shù)參數(shù)時,將會拋出一個語法錯誤異常在非嚴(yán)格模式中,這種表達式什么也沒做,并返回。 JavaScript之use strict use strict是ECMAScript 5引入的一條指令。指令不是語句(但非常接近于語句)。usestrict指令和普通的語句之間有兩個重要的區(qū)別: 它不包含任何語言的關(guān)鍵字,指令僅僅是一個包含一個特殊...

    econi 評論0 收藏0
  • function作為構(gòu)造函數(shù)和非構(gòu)造函數(shù)調(diào)用的區(qū)別

    摘要:把這個執(zhí)行上下文壓入調(diào)用棧的頂部,即設(shè)置成運行執(zhí)行上下文。函數(shù)作為構(gòu)造函數(shù)調(diào)用沒有繼承關(guān)系有繼承關(guān)系我們把一個函數(shù)被當(dāng)作構(gòu)造函數(shù),使用操作符調(diào)用時發(fā)生的主要步驟新建一個普通對象,把其原型指向構(gòu)造函數(shù)的屬性的值。把當(dāng)前執(zhí)行上下文彈出調(diào)用棧。 var currentTime = Date() 能生成一個當(dāng)前時間的日期對象,var currentTime = new Date() 也能生成一...

    didikee 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<