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

資訊專(zhuān)欄INFORMATION COLUMN

Strict Mode和Extended Mode - Javascript語(yǔ)法基礎(chǔ) - Javas

SHERlocked93 / 2364人閱讀

摘要:之后,在瀏覽器大戰(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ì)evalarguments賦值

```
var fun = function(){
    "use strict";
    eval=16
}();
```

不可將evalarguments作為參數(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不做任何修改

即使指定nullundefined,引擎也不會(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ù)的callerarguments來(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

相關(guān)文章

  • Strict Mode - Javascript語(yǔ)法基礎(chǔ) - Javascript核心

    原文: 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...

    jzzlee 評(píng)論0 收藏0
  • ES6語(yǔ)法特性 - ES6 - ECMAScript特性 - Javascript核心

    摘要:前三個(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...

    Joyven 評(píng)論0 收藏0
  • ES6語(yǔ)法特性 - ES6 - ECMAScript特性 - Javascript核心

    摘要:前三個(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...

    StonePanda 評(píng)論0 收藏0
  • ES6語(yǔ)法特性 - ES6 - ECMAScript特性 - Javascript核心

    摘要:前三個(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...

    jas0n 評(píng)論0 收藏0
  • JavaScript中的嚴(yán)格模式

    摘要:字符串不能用作標(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)...

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

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

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<