成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

javascript嚴(yán)格模式

Chao / 1384人閱讀

摘要:概述的嚴(yán)格模式是中的一種限制性更強(qiáng)的變種方式。嚴(yán)格模式在語義上與正常的有一些不同。首先,嚴(yán)格模式會(huì)將陷阱直接變成明顯的錯(cuò)誤。嚴(yán)格模式禁止刪除聲明變量。

概述

ECMAScript 5的嚴(yán)格模式是JavaScript中的一種限制性更強(qiáng)的變種方式。嚴(yán)格模式不是一個(gè)子集:它在語義上與正常代碼有著明顯的差異。不支持嚴(yán)格模式的瀏覽器與支持嚴(yán)格模式的瀏覽器行為上也不一樣, 所以不要在未經(jīng)嚴(yán)格模式特性測(cè)試情況下使用嚴(yán)格模式。嚴(yán)格模式可以與非嚴(yán)格模式共存,所以腳本可以逐漸的選擇性加入嚴(yán)格模式。

嚴(yán)格模式在語義上與正常的JavaScript有一些不同。 首先,嚴(yán)格模式會(huì)將JavaScript陷阱直接變成明顯的錯(cuò)誤。其次,嚴(yán)格模式修正了一些引擎難以優(yōu)化的錯(cuò)誤:同樣的代碼有些時(shí)候嚴(yán)格模式會(huì)比非嚴(yán)格模式下更快。 第三,嚴(yán)格模式禁用了一些有可能在未來版本中定義的語法。

如果你想讓你的JavaScript代碼在嚴(yán)格模式下運(yùn)行,可以參考轉(zhuǎn)換成嚴(yán)格模式。

開啟嚴(yán)格模式 作用于整個(gè)腳本文件

需要在所有語句之前放一個(gè)特定語句 "use strict"; (或 "use strict";)注意必須是腳本開始第一行,否則無效

// 整個(gè)語句都開啟嚴(yán)格模式的語法
"use strict";
var v = "Hi!  I"m a strict mode script!";

合并不同模式的代碼文件成一個(gè)文件,需要特別注意:
這種語法存在陷阱,有一個(gè)大型網(wǎng)站已經(jīng)被它坑倒了:不能盲目的合并沖突代碼。試想合并一個(gè)嚴(yán)格模式的腳本和一個(gè)非嚴(yán)格模式的腳本:合并后的腳本代碼看起來是嚴(yán)格模式。反之亦然:非嚴(yán)格合并嚴(yán)格看起來是非嚴(yán)格的。合并均為嚴(yán)格模式的腳本或均為非嚴(yán)格模式的都沒問題,只有在合并嚴(yán)格模式與非嚴(yán)格模式有可能有問題。建議按一個(gè)個(gè)函數(shù)去開啟嚴(yán)格模式(至少在學(xué)習(xí)的過渡期要這樣做)

作用于單個(gè)函數(shù)

同樣講"use strict";置于函數(shù)開始的第一行
測(cè)試生效:

!function(){
    "use strict";
    x=1;
    console.log(x);    //因嚴(yán)格模式不允許未聲明的變量被賦值,會(huì)報(bào)錯(cuò)
}();

報(bào)錯(cuò)信息:

$ node 嚴(yán)格模式.js
D:js嚴(yán)格模式.js:3
        x=1;
         ^

ReferenceError: x is not defined

如果不是放在第一行沒有進(jìn)入嚴(yán)格模式,結(jié)果會(huì)是1

嚴(yán)格模式有哪些不同

不允許未聲明的變量被賦值(見上例)

將拼寫錯(cuò)轉(zhuǎn)成異常

"use strict";
// 假如有一個(gè)全局變量叫做mistypedVariable
mistypedVaraible = 17; // 因?yàn)樽兞棵磳戝e(cuò)誤,這一行代碼就會(huì)拋出 ReferenceError

在嚴(yán)格模式下, 試圖刪除不可刪除的屬性時(shí)會(huì)拋出異常(之前這種操作不會(huì)產(chǎn)生任何效果):

"use strict";
delete Object.prototype; // 拋出TypeError錯(cuò)誤

對(duì)象字面量重復(fù)屬性名報(bào)錯(cuò)
正常模式下重名屬性是允許的,最后一個(gè)重名的屬性決定其屬性值。因?yàn)橹挥凶詈笠粋€(gè)屬性起作用,當(dāng)代碼是要改變屬性值而卻不是修改的最后一個(gè)重名屬性的時(shí)候,復(fù)制這個(gè)對(duì)象就產(chǎn)生一連串的bug。在嚴(yán)格模式下,重名屬性被認(rèn)為是語法錯(cuò)誤:

"use strict";
var o = { p: 1, p: 2 }; // !!! 語法錯(cuò)誤

嚴(yán)格模式禁止八進(jìn)制數(shù)字語法.
測(cè)試如下:

!function(){
    console.log(0123);                //八進(jìn)制字面量不被允許
}();

報(bào)錯(cuò)信息如下:

$ node 嚴(yán)格模式.js
D:js嚴(yán)格模式.js:19
        console.log(0123);                //八進(jìn)制字面量不被允許
                    ^^^^
SyntaxError: Octal literals are not allowed in strict mode.

禁止使用with語句
因?yàn)閣ith語句無法在編譯時(shí)就確定,屬性到底歸屬哪個(gè)對(duì)象。嚴(yán)格模式下, 使用 with 會(huì)引起語法錯(cuò)誤, 所以就不會(huì)存在 with 塊內(nèi)的變量在運(yùn)行是才決定引用到哪里的情況了

"use strict";
var x = 17;
with (obj) // !!! 語法錯(cuò)誤
{
  // 如果沒有開啟嚴(yán)格模式,with中的這個(gè)x會(huì)指向with上面的那個(gè)x,還是obj.x?
  // 如果不運(yùn)行代碼,我們無法知道,因此,這種代碼讓引擎無法進(jìn)行優(yōu)化,速度也就會(huì)變慢。
  x;
}

eval 獨(dú)立作用域
在嚴(yán)格模式下 eval 僅僅為被運(yùn)行的代碼創(chuàng)建變量,eval作用域內(nèi)不再能夠生成全局變量了,它所生成的變量只能用于eval內(nèi)部。

var x = 17;
var evalX = eval(""use strict"; var x = 42; x");
console.log(x === 17);        //true
console.log(evalX === 42);        //true

嚴(yán)格模式禁止刪除聲明變量。delete name 在嚴(yán)格模式下會(huì)引起語法錯(cuò)誤:

"use strict";

var x;
delete x; `// !!! 語法錯(cuò)誤

this不再指向全局對(duì)象
一個(gè)開啟嚴(yán)格模式的函數(shù),指定的this不再被封裝為對(duì)象,而且如果沒有指定this的話它值是undefined

function fun() { return this; }
console.log(fun() === undefined);    //true
console.log(fun.call(2) === 2);        //true
console.log(fun.apply(null) === null);        //true
console.log(fun.call(undefined) === undefined);        //true
console.log(fun.bind(true)() === true);        //true

arguments變?yōu)閰?shù)的靜態(tài)副本
嚴(yán)格模式下,函數(shù)的 arguments 對(duì)象會(huì)保存函數(shù)被調(diào)用時(shí)的原始參數(shù)。arguments[i] 的值不會(huì)隨與之相應(yīng)的參數(shù)的值的改變而變化,同名參數(shù)的值也不會(huì)隨與之相應(yīng)的 arguments[i] 的值的改變而變化。

function f(a)
{
  "use strict";
  a = 42;
  return [a, arguments[0]];
}
var pair = f(17);
console.log(pair);    //[ 42, 17 ]

參考資料

MDN文檔
阮一峰老師的博客

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/80005.html

相關(guān)文章

  • JavaScript面向?qū)ο笾械?em>嚴(yán)格模式

    摘要:開啟嚴(yán)格模式設(shè)置對(duì)象是一個(gè)不可擴(kuò)展的對(duì)象為對(duì)象新增屬性張無忌在非嚴(yán)格模式下為不可擴(kuò)展的對(duì)象添加新屬性,結(jié)果是靜默失敗。 概述 嚴(yán)格模式是什么 嚴(yán)格模式是JavaScript中的一種限制性更強(qiáng)的變種方式。嚴(yán)格模式不是一個(gè)子集:它在語義上與正常代碼有著明顯的差異。不支持嚴(yán)格模式的瀏覽器與支持嚴(yán)格模式的瀏覽器行為上也不一樣,所以不要在未經(jīng)嚴(yán)格模式特性測(cè)試情況下使用嚴(yán)格模式。嚴(yán)格模式可以與非嚴(yán)...

    bang590 評(píng)論0 收藏0
  • 那些年,前端學(xué)習(xí)之路的疑難雜癥(一):嚴(yán)格模式與非嚴(yán)格模式

    摘要:反之亦然非嚴(yán)格合并嚴(yán)格看起來是非嚴(yán)格的。在普通的里面給一個(gè)拼寫錯(cuò)誤的變量名賦值會(huì)使全局對(duì)象新增一個(gè)屬性并繼續(xù)工作盡管后面可能出錯(cuò)在現(xiàn)在的中有可能。第三嚴(yán)格模式禁止刪除聲明變量。 文章整理自MSDN:https://developer.mozilla.org... 1.逐步使用嚴(yán)格模式 ECMAScript 5的嚴(yán)格模式是JavaScript中的一種限制性更強(qiáng)的變種方式。嚴(yán)格模式不是一個(gè)...

    zombieda 評(píng)論0 收藏0
  • 1.你不知道的JavaScript-嚴(yán)格模式

    摘要:針對(duì)單個(gè)函數(shù)將放在函數(shù)體的第一行,則整個(gè)函數(shù)以嚴(yán)格模式運(yùn)行。嚴(yán)格模式禁止這種用法,全局變量必須顯式聲明。嚴(yán)格模式下,這屬于語法錯(cuò)誤。嚴(yán)格模式禁止這種表示法,整數(shù)第一位為,將報(bào)錯(cuò)。也就是說,不允許在非函數(shù)的代碼塊內(nèi)聲明函數(shù)。 本文轉(zhuǎn)自【阮一峰博客】:http://www.ruanyifeng.com/blo... 一、概述 除了正常運(yùn)行模式,ECMAscript 5添加了第二種運(yùn)行模式:...

    FuisonDesign 評(píng)論0 收藏0
  • 談?wù)?em>JavaScript中嚴(yán)格模式你應(yīng)該遵守的那些事

    嚴(yán)格模式 首先來了解一下嚴(yán)格模式是什么?嚴(yán)格模式是JavaScript中的一種限制性更強(qiáng)的變種方式,不是一個(gè)子集:它在語義上與正常代碼有明顯的差異,不支持嚴(yán)格模式的瀏覽器與支持嚴(yán)格模式的瀏覽器行為上也不一樣,所以不要在未經(jīng)嚴(yán)格模式特性測(cè)試情況下使用嚴(yán)格模式,嚴(yán)格模式可以與非嚴(yán)格模式共存,所以腳本可以逐漸的選擇性加入嚴(yán)格模式 嚴(yán)格模式的目的 首先,嚴(yán)格模式會(huì)將JavaScript陷阱直接變成明顯的錯(cuò)...

    MingjunYang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<