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

資訊專欄INFORMATION COLUMN

JavaScript中的嚴(yán)格模式

wwolf / 2089人閱讀

摘要:字符串不能用作標(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)行在正常模式中的,除了正常運(yùn)行模式,ECMAscript 5添加了第二種運(yùn)行模式:"嚴(yán)格模式"(strict mode)??疵志椭溃@種模式會(huì)讓JavaScript在更嚴(yán)格的環(huán)境中運(yùn)行。

包括IE 10在內(nèi)的主流瀏覽器,都已經(jīng)支持它,許多大項(xiàng)目已經(jīng)開(kāi)始全面擁抱。(github上面好多項(xiàng)目都是用的嚴(yán)格模式)

啟用嚴(yán)格模式 為整個(gè)腳本啟用嚴(yán)格模式

在所有語(yǔ)句之前放一個(gè)特定語(yǔ)句 "use strict",假設(shè)有一個(gè)腳本reeoo.js,可以這樣開(kāi)啟嚴(yán)格模式:

"use strict";
var name = "Reeoo";
console.log(name);

BUT這種寫(xiě)法存在天然的坑,假如我們要做代碼合并,我現(xiàn)在要把heigui.js

heigui = "db";

reeoo.js進(jìn)行合并,本來(lái)兩個(gè)腳本分開(kāi)執(zhí)行是好好的,合起來(lái)就會(huì)報(bào)錯(cuò)。

Uncaught ReferenceError: heigui is not defined(…)

一個(gè)嚴(yán)格模式的腳本和一個(gè)非嚴(yán)格模式的腳本合并可能會(huì)導(dǎo)致非嚴(yán)格模式的腳本代碼報(bào)錯(cuò),建議代碼都包在一個(gè)立即執(zhí)行函數(shù)里面。

(function(){
    "use strict";
    var name = "reeoo";
})();

(function(){
    heigui = "db";
})();

這樣合并之后就不會(huì)報(bào)錯(cuò)了。

為某個(gè)函數(shù)啟用嚴(yán)格模式

要給某個(gè)函數(shù)開(kāi)啟嚴(yán)格模式,得把"use strict"; 聲明放在函數(shù)體所有語(yǔ)句之前就行了。

function strictFun()
{
  // 函數(shù)級(jí)別嚴(yán)格模式語(yǔ)法
  "use strict";
  console.log("I am a strictmode function!");
}

function normalFun() { 
    console.log("I am a mormal function!");
}
Chrome中調(diào)試嚴(yán)格模式

我有這么一段代碼:

"use strict"
name = "reeoo";
console.log(name) 

把這段代碼直接粘貼到Chrome的控制臺(tái)中執(zhí)行,正常情況下應(yīng)該報(bào)錯(cuò),但是并沒(méi)有報(bào)錯(cuò),

很顯然,嚴(yán)格模式下變量不適用var聲明是不合法的,但是為什么沒(méi)有報(bào)錯(cuò)?

這是什么鬼,難道Chrome不支持嚴(yán)格模式?開(kāi)什么玩笑。。。

網(wǎng)上搜了一下,原來(lái)Chrome的控制臺(tái)的代碼是運(yùn)行在eval之中的,你沒(méi)法對(duì)eval函數(shù)使用嚴(yán)格模式(應(yīng)該也不完全對(duì),但是具體Chrome做了什么,不得而知),下圖說(shuō)明eval函數(shù)可以使用嚴(yán)格模式:

要想在Chrome瀏覽器中對(duì)嚴(yán)格模式正常報(bào)錯(cuò),需要在代碼外層套一個(gè)立即執(zhí)行函數(shù),或者其它類似的措施。

(function(){
    "use strict"
    name = "reeoo";
    console.log(name) 
})()

這樣就可以了

FireFox代碼草稿紙調(diào)試嚴(yán)格模式

Chrome非要我們包一層閉包才能跑?chē)?yán)格模式,既然這么麻煩,有沒(méi)有別的方式可以直接跑?chē)?yán)格模式的代碼呢?

FireFox有一個(gè)代碼草稿紙可以直接跑,快捷鍵SHIFT+F4

嚴(yán)格模式到底有多嚴(yán)格 嚴(yán)格模式中一些重要的限制

1. 變量聲明

不允許使用一個(gè)沒(méi)有聲明的變量

"use strict";
name = "reeoo";

報(bào)錯(cuò)(代碼草稿紙,下同)

Exception: ReferenceError: assignment to undeclared variable name

2. 修改只讀屬性的值

"use strict";
var testObj = Object.defineProperties({}, {
    prop1: {
        value: 10,
        writable: false // 一個(gè)只讀的屬性
    },
    prop2: {
        get: function () {
        }
    }
});
testObj.prop1 = 20; //嘗試改變prop1的值
testObj.prop2 = 30;//嘗試改變prop2的值

嚴(yán)格模式下會(huì)報(bào)錯(cuò):

Uncaught TypeError: Cannot assign to read only property "prop1" of #

非嚴(yán)格模式頂多就是值賦不上去而已,并不會(huì)報(bào)錯(cuò)

3. 修改不可擴(kuò)展的屬性

表現(xiàn)為將屬性添加到 extensible 屬性設(shè)置為 false 的對(duì)象。

"use strict";
var testObj = new Object();
Object.preventExtensions(testObj);//經(jīng)過(guò)這個(gè)方法處理過(guò)的對(duì)象,不影響原有對(duì)象的刪除,修改.但是無(wú)法添加新的屬性成員了.
testObj.name = "reeoo";

嚴(yán)格模式報(bào)錯(cuò):

Uncaught TypeError: Can"t add property name, object is not extensible

非嚴(yán)格模式不會(huì)報(bào)錯(cuò),但是testObj也不會(huì)被擴(kuò)展。

4. 刪除變量、函數(shù)或參數(shù)

刪除 configurable 特性設(shè)置為 false 的屬性。

"use strict";
var testvar = 15,testObj={};
function testFunc() {};
delete testvar;
delete testFunc;

Object.defineProperty(testObj, "testvar", {
    value: 10,
    configurable: false
    });
delete testObj.testvar;

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

Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.

5. 在一個(gè)對(duì)象文本中多次定義某個(gè)屬性

嚴(yán)格模式下不允許一個(gè)屬性有多個(gè)定義

"use strict";
var testObj = {
    prop1: 10,
    prop2: 15,
    prop1: 20
};

報(bào)錯(cuò)(node控制臺(tái))

Duplicate data property in object literal not allowed in strict mode

正常模式中后聲明的重復(fù)的變量會(huì)覆蓋前面聲明的,而且不會(huì)報(bào)錯(cuò)。

注:這個(gè)問(wèn)題在ECMAScript6中已被修復(fù)。

6. 嚴(yán)格模式下不允許形參參數(shù)名稱重復(fù)

"use strict";
function testFunc(param1, param1) {
    return 1;
};

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

Uncaught SyntaxError: Duplicate parameter name not allowed in this context

7. 無(wú)法使用標(biāo)識(shí)符的未來(lái)保留字,嚴(yán)格模式下將保留標(biāo)識(shí)符名稱

一下標(biāo)識(shí)符(ES6中依然沒(méi)有實(shí)現(xiàn)的)在嚴(yán)格模式中是不能使用的,否則也會(huì)報(bào)錯(cuò)。

用了就是這個(gè)下場(chǎng):

Uncaught SyntaxError: Unexpected strict mode reserved word
implements
interface
package
private
protected
public
static
yield

8. 嚴(yán)格模式下不允許使用八進(jìn)制數(shù)字參數(shù)和轉(zhuǎn)義字符

"use strict";
var testoctal = 010;
var testescape =