首頁  >  文章  >  web前端  >  JavaScript高階語法學習之嚴格模式

JavaScript高階語法學習之嚴格模式

WBOY
WBOY轉載
2022-05-24 13:45:411686瀏覽

本篇文章為大家帶來了關於javascript的相關知識,其中主要介紹了關於嚴格模式的相關問題,嚴格模式很好理解,是一種具有限制性的JavaScript模式,從而使程式碼隱式的脫離了“懶散模式”,下面一起來看一下,希望對大家有幫助。

JavaScript高階語法學習之嚴格模式

【相關推薦:javascript影片教學web前端

##一、認識嚴格模式

  • 在ECMAScript5標準中,JavaScript提出了嚴格模式的感念:

    • 嚴格模式很好理解,是一種具有限制性的JavaScript模式,從而使程式碼隱式的脫離了「懶散模式」。

    • 支援嚴格模式的瀏覽器在偵測到程式碼中有嚴格模式時,會以更嚴格的方式對程式碼進行偵測和執行。

  • 嚴格模式對正常的JavaScript語意做了一些限制:

    • 嚴格模式透過

      拋出錯誤來消除一些原有的靜默錯誤

    • 嚴格模式讓JS引擎在執行程式碼時可以進行更多的最佳化(不需要對一些特殊的語法進行處理)。

    • 嚴格模式停用了在ECMAScript未來版本中可能會定義的一些語法。

二、開啟嚴格模式

那麼如何開啟嚴格模式呢?嚴格模式支援粒度化的遷移:

    可以支援在js檔案中開啟嚴格模式;
  • 也支援對某一個函數開啟嚴格模式;
#三、嚴格模式限制

JavaScript被設計為新手開發者更容易上手,所以有時候本買錯誤語法,別認為也是可以正常被解析的;

但是這種方式可能給帶來留下安全隱患;
在嚴格模式下,這種事務就會被當做錯誤,以便可以快速的發現和修正;
總結了一下幾點常見的限制:

#1.無法意外的創建全域變數

意外的創建全域變數的方式有兩種:

##全域不使用關鍵字直接宣告全域變數
  • 在函數內部不使用關鍵字宣告變數函數預設提升為全域變數
  • 範例程式碼如下:

  • 'use strict'
    // 禁止意外创建全局变量
    message = '意外创建全局变量'
    console.log(message) // 报错信息为:Uncaught ReferenceError: message is not defined
    
    function foo () {
        age = 20
        console.log(age)
    }
    foo() // ReferenceError: age is not defined
2.嚴格模式下會使引起靜默失敗的賦值操作報出錯誤異常

範例程式碼如下:

//开启严格模式,将问题直接转化为报错
'use strict'
const v = 100;//(定义常量)
v = 1.14;//重新赋值(为变量)

console.log(v); // Uncaught TypeError: Assignment to constant variable.

3.嚴格模式下試圖刪除不可刪除的屬性

嚴格模式下,不能對變數使用delect運算子。

(1).對變數使用delete關鍵字

  // 开启严格模式
'use strict'

var v = 100;
delete v;//非严格模式下:此处为静默失败,既没有报错也没有删除变量v
console.log(v);//100
//开启严格模式后,改为报错Delete of an unqualified identifier in strict mode.

(2).對數組和對方法屬性使用delete關鍵字

嚴格模式下對數組和對方法屬性使用delete關鍵字,效果不變。

// 开启严格模式
'use strict'

// 1、严格模式下删除数组内容
var arr = [1,2,3,4]
delete arr[0];
console.log(arr);//[ <1 empty item>, 2, 3, 4 ]

// 2、严格模式下delete函数的属性
var obj  =  {
    name : '猪猪侠 '
}
delete obj.name;
console.log(obj.name)//undefined

4.嚴格模式不允許函數參數有相同的名稱

#範例程式碼如下:

'use strict'
// 不允许函数有相同的参数名称
function foo2 (x, y, x) {
    console.log(x, y, x)
}
foo2(10, 20, 30) // SyntaxError: Duplicate parameter name not allowed in this context

5.不允許0的八進位語法

範例程式碼如下:

// 不允许使用原先的八进制格式
var num1 = 0123
var num2 = 0o123 // 可以写成这种格式 八进制
var num3 = 0x123 // 可以写成这种格式 十六进制
var num4 = 0b100 // 可以写成这种格式 二进制

console.log(num1) // SyntaxError: Octal literals are not allowed in strict mode.
console.log(num2, num3, num4) // 83 291 4

6.在嚴格模式下,不允許使用with

##範例程式碼如下:
'use strict'
var message = 'Hello World';

var obj = { name: 'jam', age: 20 }
// with语句可以形成自己的作用域,在with语句中打印age时,会输出obj对象中的age属性,但在with语句中打印不存在的属性message时,会向外层的作用域一层一层去查找
function foo () {
    with (obj) {
        console.log(age) 
        console.log(message) 
    }
    console.log(message)
}
foo() // SyntaxError: Strict mode code may not include a with statement

7.在嚴格模式下,eval不再為上層引用變數

#範例程式碼如下:
var jsString = "var message = 'hello world';console.log(message)"
eval(jsString) // 输出  hello world
console.log(message) // 报错信息为:ReferenceError: message is not defined

##開啟嚴格模式eval函數不會向上引用變數所以全域作用域就沒有message這個變數所以會報錯

8.嚴格模式下,this綁定不會預設轉成物件

範例程式碼如下:
'use strict'
// 在严格模式下,自执行函数(默认绑定)会指向undefined  ,非严格模式下会指向window
function foo () {
    console.log(this)
}
foo() // undefined
【相關推薦:

javascript影片教學

web前端

以上是JavaScript高階語法學習之嚴格模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除