国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JS專題之嚴(yán)格模式

baukh789 / 2742人閱讀

摘要:整個(gè)腳本文件就會以嚴(yán)格模式執(zhí)行。函數(shù)作用域范圍將放在函數(shù)體的第一行,則整個(gè)函數(shù)以嚴(yán)格模式運(yùn)行。嚴(yán)格模式下,必須指明的指向?qū)ο蟆=乖诜呛瘮?shù)代碼塊聲明函數(shù)的嚴(yán)格模式只允許在全局作用域或函數(shù)作用域聲明函數(shù)。

ECMAScript 5 引入了 strict mode ,現(xiàn)在已經(jīng)被大多瀏覽器實(shí)現(xiàn)(從IE10開始)

一、什么是嚴(yán)格模式

顧名思義,JavaScript 嚴(yán)格模式就是讓 JS 代碼以更嚴(yán)格的模式執(zhí)行,不允許可能會引發(fā)錯(cuò)誤的代碼執(zhí)行。在正常模式下靜默失敗的代碼,嚴(yán)格模式下就會拋出錯(cuò)誤。

二、為什么要過渡到嚴(yán)格模式

嚴(yán)格模式下的代碼在運(yùn)行的時(shí)候,更容易通過拋出的錯(cuò)誤定位到問題所在的地方

嚴(yán)格模式能夠幫助你編寫更符合規(guī)范的代碼

消除 JavaScript 語言上一些不合理,比較怪異的行為

為未來新版本的 JavaScript 做鋪墊

有時(shí)候,嚴(yán)格模式下的 JavaScript 代碼運(yùn)行起來更快

三、如何使用

· 腳本文件范圍

"use strict"; 放在腳本文件的第一行。整個(gè)腳本文件就會以“嚴(yán)格模式”執(zhí)行。

· 函數(shù)作用域范圍

"use strict"; 放在函數(shù)體的第一行,則整個(gè)函數(shù)以"嚴(yán)格模式"運(yùn)行。

文件合并時(shí),寫在腳本文件第一行的 "use strict"; 來實(shí)現(xiàn)嚴(yán)格模式會失效,可以將腳本文件的代碼放在一個(gè)立即執(zhí)行表達(dá)式中。

(funciton() {
    "use strict";
    ...
})()
四、嚴(yán)格模式的具體定義

嚴(yán)格模式下無法再隱式創(chuàng)建全局變量

也就是,變量必須聲明后才能使用,正常模式直接賦值給一個(gè)未定義的變量時(shí),會將變量定義為全局變量。

"use strict";
var a = b = 3;  // Uncaught ReferenceError: b is not defined

以上代碼等于:
var a;
b = 3;
a = b;

禁止 this 關(guān)鍵字指向全局對象

正常模式下,函數(shù)中如果沒有指明 this 對象,JS 則會將 this 隱式指向?yàn)槿謱ο蟆H绻壎ǖ闹凳欠菍ο螅瑢⒈蛔詣?dòng)轉(zhuǎn)為對象再綁定上去,而 null 和 undefined 這兩個(gè)無法轉(zhuǎn)成對象的值,將被忽略。

嚴(yán)格模式下,必須指明 this 的指向?qū)ο蟆H绻麤]有指明的話,this的值為 undefined

var name = "foo";
function func() {
    "use strict";
    this.name;  // Uncaught TypeError: Cannot read property "name" of undefined
}
func();  // 沒有加 new 關(guān)鍵字
new func();

function func() {
    return this
}

func() // window
func.call(8) // Number {8}
func.call(true) // Boolean {true}
func.call("abcd")  // {"abcd"}
func.call(null) // window
func.call(undefined) // window

"use strict"
function func() {
    return this
}

func() // undefined
func.call(8) // 8
func.call(true) // true
func.call(null) //null
func.call(undefined) // undefined

不允許在函數(shù)內(nèi)部遍歷調(diào)用棧

禁止使用 arguments.callee、arguments.caller、fn.caller、fn.callee;
在嚴(yán)格模式下,arguments.callee 是一個(gè)不可刪除屬性,而且賦值和讀取時(shí)都會拋出異常

function func() {
    "use strict";
    func.caller;  // 報(bào)錯(cuò)
    func.arguments; // Uncaught TypeError: "caller", "callee", and "arguments" properties may not be accessed on strict mode functions or the arguments objects for calls to them
}
func()

禁止向?qū)ο蟮闹蛔x屬性賦值,禁止刪除對象的不可設(shè)置屬性, 禁止向不可擴(kuò)展的對象添加屬性

無法刪除 var 聲明的變量。

在正常模式中,給對象的只讀屬性賦值, 刪除對象的不可設(shè)置屬性,添加不可擴(kuò)展對象的新屬性,會靜默失敗。

但是在嚴(yán)格模式中,會拋出錯(cuò)誤。
另外,字符串的屬性 length 也是只讀屬性,修改后會報(bào)錯(cuò)。

"use strict";
var str = "abc"
str.length = 8  // Uncaught TypeError: Cannot assign to read only property "length" of string "abc"

"use strict";
var obj = Object.defineProperty({}, "a", {
  value: 37,
  writable: false
});
obj.a = 123; // Uncaught TypeError: Cannot assign to read only property "a" of object "#

"use strict";
var obj = Object.defineProperty({}, "p", {
  value: 37,
  configurable: false
});
delete obj.p  // Uncaught TypeError: Cannot delete property "p" of #

var obj = {};
Object.preventExtensions(obj);
obj.title = "hello";  // Uncaught TypeError: Cannot add property title, object is not extensible

對象不允許有重名的屬性,函數(shù)不允許有重名的參數(shù)

在正常模式中,對象的重名屬性,位置靠后會覆蓋位置靠前的重名屬性。函數(shù)也是,函數(shù)體查找到的參數(shù),靠后的重名參數(shù)會覆蓋靠前的重名參數(shù)。

"use strict";
var o = { 
    p: 1,
    p: 2
   };
// IE報(bào)錯(cuò):strict 模式下不允許一個(gè)屬性有多個(gè)定義, 新版的 Chrome 和 firefox 并不會報(bào)錯(cuò),會采用覆蓋機(jī)制。

"use strict";
function func(a, a) {
    console.log(a)
}
func(1, 2) // IE報(bào)錯(cuò): strict 模式下不允許正式參數(shù)名稱重復(fù)。新版的 Chrome 和 firefox 并不會報(bào)錯(cuò),會采用覆蓋機(jī)制。

靜態(tài)綁定

JavaScript 支持動(dòng)態(tài)綁定,也就是 JavaScript 的屬性和方法是在運(yùn)行時(shí)確定,而不是在編譯時(shí)確定。
于是,JavaScript 嚴(yán)格模式禁用了 with 語句, 因?yàn)槭褂昧?with 語句,with 語句塊中變量無法確定是外部全局變量還是傳入的對象屬性。

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

eval 關(guān)鍵字不再會給上層函數(shù)(surrounding function)或者全局引入一個(gè)新的變量。在嚴(yán)格模式中,eval 語句會創(chuàng)建自己的一個(gè)作用域,eval 里的變量只能在 eval 內(nèi)部使用。

arguments 的限定

嚴(yán)格模式規(guī)定名稱為 eval 和 arguments 不能通過程序語法被綁定(be bound)或賦值
嚴(yán)格模式下,參數(shù)的值不會隨 arguments 對象的值的改變而變化。

正常模式中,對參數(shù)重新賦值,會修改 arguments 類數(shù)組對象下的參數(shù)值。同時(shí),修改 arguments 類數(shù)組對象的值,也會修改函數(shù)參數(shù)的值。

嚴(yán)格模式下,不僅參數(shù)的值不會隨著 arguments 類數(shù)組對象的變化而變化,參數(shù)的變化也不會引起 arguments 對象的變化,arguments 對象會記住參數(shù)的傳入初始值。

function func(a) {
"use strict"
  a = 8;
  // arguments[0] = 8
  return [a, arguments[0]]
}

func(3) // [8, 3]

function func(a) {
"use strict"
  arguments[0] = 8
  return [a, arguments[0]]
}

func(3) // [3, 8]

ES5禁止在非函數(shù)代碼塊聲明函數(shù)

ES5 的嚴(yán)格模式只允許在全局作用域或函數(shù)作用域聲明函數(shù)。也就是說,不允許在非函數(shù)的代碼塊內(nèi)聲明函數(shù)。

if (true) {
  function add() {
  }
}
add()

for (var i = 0; i < 5; i++){
  function f2() { } // !!! 語法錯(cuò)誤
  f2();
}

以上代碼在嚴(yán)格模式是禁止的,但是在 ES6 中,是允許在代碼塊中聲明函數(shù)的。

保留關(guān)鍵字

嚴(yán)格模式中一部分字符變成了保留的關(guān)鍵字。這些字符包括implements, interface, let, package, private, protected, public, staticyield。在嚴(yán)格模式下,你不能再用這些名字作為變量名或者形參名

function private() {"use strict" }  //Uncaught SyntaxError: Unexpected strict mode reserved word

嚴(yán)格模式禁止八進(jìn)制數(shù)字語法

五、向嚴(yán)格模式過渡

嚴(yán)格模式能夠幫助我們寫出更安全,更有規(guī)范的代碼,則應(yīng)該避免一些危險(xiǎn)的寫法,采用更好的寫法:

變量先聲明,再使用,

this 應(yīng)該在指向自己創(chuàng)建的對象時(shí)使用。

arguments 應(yīng)該在函數(shù)第一行就拷貝出來。

六、嚴(yán)格模式的缺點(diǎn)

現(xiàn)在的代碼都會進(jìn)行文件壓縮和合并,此時(shí)嚴(yán)格模式就會失效。

總結(jié)

現(xiàn)在的 webpack 會在打包的時(shí)候默認(rèn)是嚴(yán)格模式,所以現(xiàn)在不用再手動(dòng)寫 use strict了。嚴(yán)格模式能幫助我們以更規(guī)范的方式書寫代碼,但是無論是否嚴(yán)格模式,都應(yīng)該注意代碼的規(guī)范,避免隱式 bug 的出現(xiàn)。

2018/02/08  @Starbucks

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

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/101568.html

相關(guān)文章

  • underscore 系列如何寫自己的 underscore

    摘要:因?yàn)樵谖⑿判〕绦蛑校投际牵由嫌謴?qiáng)制使用嚴(yán)格模式,為,掛載就會發(fā)生錯(cuò)誤,所以就有人又發(fā)了一個(gè),代碼變成了這就是現(xiàn)在的樣子。 前言 在 《JavaScript 專題系列》 中,我們寫了很多的功能函數(shù),比如防抖、節(jié)流、去重、類型判斷、扁平數(shù)組、深淺拷貝、查找數(shù)組元素、通用遍歷、柯里化、函數(shù)組合、函數(shù)記憶、亂序等,可以我們該如何組織這些函數(shù),形成自己的一個(gè)工具函數(shù)庫呢?這個(gè)時(shí)候,我們就要借...

    Invoker 評論0 收藏0
  • [面試專題]ES6箭頭函數(shù)詳解

    摘要:使用或調(diào)用由于已經(jīng)在詞法層面完成了綁定,通過或方法調(diào)用一個(gè)函數(shù)時(shí),只是傳入了參數(shù)而已,對并沒有什么影響箭頭函數(shù)不會在其內(nèi)部暴露出參數(shù)等等,都不會指向箭頭函數(shù)的,而是指向了箭頭函數(shù)所在作用域的一個(gè)名為的值如果有的話,否則,就是。 ES6之箭頭函數(shù) 標(biāo)簽(空格分隔): 未分類 返回值 單行函數(shù)體默認(rèn)返回改行計(jì)算結(jié)果, 多行需要指定返回值 let c = (a,b)=>a+b; conso...

    Caicloud 評論0 收藏0
  • [面試專題]ES6箭頭函數(shù)詳解

    摘要:使用或調(diào)用由于已經(jīng)在詞法層面完成了綁定,通過或方法調(diào)用一個(gè)函數(shù)時(shí),只是傳入了參數(shù)而已,對并沒有什么影響箭頭函數(shù)不會在其內(nèi)部暴露出參數(shù)等等,都不會指向箭頭函數(shù)的,而是指向了箭頭函數(shù)所在作用域的一個(gè)名為的值如果有的話,否則,就是。 ES6之箭頭函數(shù) 標(biāo)簽(空格分隔): 未分類 返回值 單行函數(shù)體默認(rèn)返回改行計(jì)算結(jié)果, 多行需要指定返回值 let c = (a,b)=>a+b; conso...

    sevi_stuo 評論0 收藏0
  • [面試專題]ES6箭頭函數(shù)詳解

    摘要:使用或調(diào)用由于已經(jīng)在詞法層面完成了綁定,通過或方法調(diào)用一個(gè)函數(shù)時(shí),只是傳入了參數(shù)而已,對并沒有什么影響箭頭函數(shù)不會在其內(nèi)部暴露出參數(shù)等等,都不會指向箭頭函數(shù)的,而是指向了箭頭函數(shù)所在作用域的一個(gè)名為的值如果有的話,否則,就是。 ES6之箭頭函數(shù) 標(biāo)簽(空格分隔): 未分類 返回值 單行函數(shù)體默認(rèn)返回改行計(jì)算結(jié)果, 多行需要指定返回值 let c = (a,b)=>a+b; conso...

    chenjiang3 評論0 收藏0

發(fā)表評論

0條評論

baukh789

|高級講師

TA的文章

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