目錄
嚴格模式
首頁 web前端 js教程 淺析js中嚴格模式所需掌握的內容

淺析js中嚴格模式所需掌握的內容

Aug 29, 2018 pm 04:20 PM
嚴格模式

這篇文章帶給大家的內容是關於淺析js中嚴格模式所需掌握的內容,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

嚴格模式

首先來了解嚴格模式是什麼?
嚴格模式是JavaScript中的一種限制性更強的變種方式,不是一個子集:它在語義上與正常程式碼有明顯的差異,不支援嚴格模式的瀏覽器與支援嚴格模式的瀏覽器行為上也不一樣,所以不要在未經嚴格模式特性測試情況下使用嚴格模式,嚴格模式可以與非嚴格模式共存,所以腳本可以逐漸的選擇性加入嚴格模式

  • 嚴格模式的目的

首先,嚴格模式會將JavaScript陷阱直接變成明顯的錯誤,其次,嚴格模式修正了一些引擎難以優化的錯誤:同樣的程式碼有些時候嚴格模式會比非嚴格模式下更快,第三,嚴格模式禁用了一些有可能在未來版本中定義的語法

  • 全域開啟嚴格模式

#在JavaScript中想要開啟嚴格模式,需要在所有程式碼之前,定義一個不會賦給任何變數的字串:

'use strict';//或者"use strict"
登入後複製

如果之前的JavaScript是非嚴格模式的話,建議不要盲目為這段程式碼開啟嚴格模式,這樣可能會出現問題,建議按一個個函數去開啟嚴格模式
也可以為某個指定的函數開啟嚴格模式:

//函数外部依旧是非严格模式
function fun(){
    'user strict';//开启严格模式
}
登入後複製

在匿名函數中使用嚴格模式,相當於在全域開啟嚴格模式的變通實作方式

(function(){
    'use strict';//开启严格模式
})();
登入後複製
  • #禁止意外建立變數

在嚴格模式下,不允許意外建立全域變數
下例程式碼是非嚴格模式下意外建立全域變數

//未声明的变量
result='这是一个没用var声明的全局变量';
登入後複製

下例程式碼是嚴格模式下意外建立全域變數

'use strict';//开启严格模式
//严格模式下,意外创建全局变量,抛出ReferenceError
message='this is message';//ReferenceError: result is not defined
登入後複製
  • 靜​​默失敗轉為異常

靜默失敗就是既不報錯也沒有任何效果,例如改變常數的值,在嚴格模式下,靜默失敗會轉換成拋出異常,注意:這個分瀏覽器,有些瀏覽器會,有些不會
下例程式碼是非嚴格模式下的靜默失敗

const PI=3.14;
PI=1.14;//静默失败
console.log(PI);//3.14
登入後複製

下例程式碼是嚴格模式下的靜默失敗

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

const PI=3.14;
PI=1.14;//抛出TypeError错误
登入後複製
  • 停用delete關鍵字

在嚴格模式下,無法對變數使用delete運算子
下例程式碼是非嚴格模式下使用delete運算符,結果會靜默失敗

var color='red';
delete color;
登入後複製

下例程式碼是嚴格模式下使用delete運算符,結果會拋出異常

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

var color='red';
delete color;//SyntaxError: Delete of an unqualified identifier in strict mode.
登入後複製
  • 對變數名稱的限制

在嚴格模式下,JavaScript對變數名稱也有限制,特別不能使用implements,interface,let,packge,private,protected,public,stalic,yield這些內容作為變數名,它們都是保留字,在ECMAScript的下一個版本中可能會用到它們,在嚴格模式下,使用這些標識符作為變數名稱會導致語法錯誤

  • ##不可刪除的屬性

在嚴格模式下,無法使用delete運算子刪除不可刪除的屬性

下例程式碼是非嚴格模式下使用delete運算子刪除不可刪除的屬性,結果是靜默失敗

delete Object.prototype;
登入後複製
下例程式碼是嚴格模式下使用delete運算子刪除不可刪除的屬性,結果會拋出異常

'use strict';//开启严格模式
delete Object.prototype;//TypeError: Cannot delete property 'prototype' of function Object() { [native code] }
登入後複製
  • 屬性名稱必須唯一

在嚴格模式下,一個物件的所有屬性名在物件內必須唯一

下例程式碼是非嚴格模式下重名屬性是允許的,最後一個重名的屬性決定其屬性值

var o={p:1,p:2};
登入後複製
下例程式碼是嚴格模式下重名屬性被認為是語法錯誤

'use strict';//开启严格模式
var o={p:1,p:2};//不报错但是语法错误
登入後複製
  • 只讀屬性的賦值

  • ##在嚴格模式下,無法為一個唯讀的屬性重新賦值
下例程式碼是非嚴格模式為唯讀屬性重新賦值,結果會靜默失敗

var obj={};
Object.defineProperty(obj,'name',{
    value:'张三',
    writable:false
});//将属性设置为只读
obj.name='李四';
登入後複製

下例程式碼是嚴格模式下為唯讀屬性重新賦值,結果會拋出例外
'use strict';//开启严格模式
var obj={};
Object.defineProperty(obj,'name',{
    value:'张三',
    writable:false
});//将属性设置为只读
obj.name='李四';//TypeError: Cannot assign to read only property 'name' of object '#<Object>'
登入後複製

    不可擴充的物件
  • 在嚴格模式下,不能為不可擴充的物件新增屬性
下例程式碼是非嚴格模式為不可擴充的物件新增屬性,結果會靜默失敗

var obj={};
Object.preventExtensinons(obj);//将对象设置为不可扩展
obj.name='张三';
登入後複製

下例程式碼是嚴格模式下不可擴充的物件新增屬性,結果會拋出異常
'use strict';//开启严格模式

var obj={};
Object.preventExtensions(obj);//将对象变得不可扩展
obj.name='张三';//TypeError: Cannot add property name, object is not extensible
登入後複製

    參數名稱必須唯一
  • 在嚴格模式下,要求命名函數的參數必須唯一
下範例程式碼是非嚴格模式下最後一個重名參數名稱會掩蓋先前的重名參數,先前的參數仍可透過arguments[i]來存取

function sum(a,a,c){}
登入後複製

下例程式碼是嚴格模式下重名參數被認為是語法錯誤
function sum(a,a,c){//语法错误
    'use strict';
    return a+a+c;//代码运行到这里会出错:SyntaxError: Duplicate parameter name not allowed in this context
}
登入後複製

    arguments的不同

在严格模式下,arguments对象的行为也有所不同
1.非严格模式下,修改命名参数的值也会反应到arguments对象中
2.严格模式下,命名参数与arguments对象是完全独立的

function fun(value){
    value='haha';
    console.log(value);//haha
    console.log(arguments[0]);//非严格模式下 hah
                              //严格模式下 hello
}

showValue('hello');
``

 - arguments.callee()
在严格模式下,不能使用arguments对象的callee()方法
下例代码是非严格模式下使用arguments对象的callee()方法,表示调用函数本身
登入後複製
var f=function(){
return arguments.callee;
};
f();
登入後複製
下例代码是严格模式下使用arguments对象的callee()方法,结果会抛出异常
登入後複製
'use strict';//开启严格模式
var f=function(){
return arguments.callee;
}
f();
/TypeError: 'caller', 'callee', and 'arguments' properties 
may not be accessed on strict mode functions or the arguments objects 
for calls to them/
登入後複製
 - 函数声明的限制
在严格模式下,只能在全局域和函数域中声明函数
下例代码非严格模式下在任何位置声明函数都是合法的
登入後複製
if(true){
function f(){}
}
登入後複製
下例是严格模式下在除全局域和函数域中声明函数是语法错误
登入後複製
'use strict';//开启严格模式
if(true){
function f(){}//语法错误,但是不报错
}
登入後複製
 - 增加eval作用域
在严格模式下,使用eval()函数创建的变量只能在eval()函数内部使用
下例代码是非严格模式下eval()函数创建的变量在其他位置可以使用
登入後複製
eval(&#39;var n=40&#39;);
console.log(n);//40
登入後複製
下例代码是严格模式下eval()函数创建的变量只能在eval()函数内部使用
登入後複製
&#39;use strict&#39;;//开启严格模式
eval(&#39;var n=40&#39;);
console.log(n);//ReferenceError: n is not defined
登入後複製
 - 禁止读写
在严格模式下,禁止使用eval()和arguments作为标识符,也不允许读写它们的值
1.使用var声明
2.赋予另一个值
3.尝试修改包含的值
4.用作函数名
5.用作命名的函数的参数
6.在try...catch语句中用作例外名
在严格模式下,以下所有尝试将导致语法错误:
登入後複製
&#39;use strict&#39;;//开启严格模式
eval=17;
arguments++;
++eval;
var obj={set p(arguments){}};
var eval;
try{}catch(arguments){}
function x(eval){}
function argunments(){}
var y=function eval(){}
var f=new Function(&#39;arguments&#39;,&#39;"use strict";return 20;&#39;);
登入後複製
 - 抑制this
在非严格模式下使用函数apply()或call()方法时,null或undefined值会被转换为全局对象
在严格模式下,函数的this值始终是指定的值(无论什么值)。
登入後複製
var color=&#39;red&#39;;
function sayColor(){
console.log(this.color);//非严格模式下 red
                    /*严格模式下:TypeError: Cannot 
                     read property &#39;color&#39; of null*/
                     }
登入後複製

相关推荐:

JS设计模式之构造器模式详解

怎么使用JS严格模式

以上是淺析js中嚴格模式所需掌握的內容的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1665
14
CakePHP 教程
1424
52
Laravel 教程
1322
25
PHP教程
1270
29
C# 教程
1249
24
JavaScript引擎:比較實施 JavaScript引擎:比較實施 Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

Python vs. JavaScript:學習曲線和易用性 Python vs. JavaScript:學習曲線和易用性 Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

從C/C到JavaScript:所有工作方式 從C/C到JavaScript:所有工作方式 Apr 14, 2025 am 12:05 AM

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

JavaScript和Web:核心功能和用例 JavaScript和Web:核心功能和用例 Apr 18, 2025 am 12:19 AM

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

JavaScript在行動中:現實世界中的示例和項目 JavaScript在行動中:現實世界中的示例和項目 Apr 19, 2025 am 12:13 AM

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

了解JavaScript引擎:實施詳細信息 了解JavaScript引擎:實施詳細信息 Apr 17, 2025 am 12:05 AM

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python vs. JavaScript:社區,圖書館和資源 Python vs. JavaScript:社區,圖書館和資源 Apr 15, 2025 am 12:16 AM

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

Python vs. JavaScript:開發環境和工具 Python vs. JavaScript:開發環境和工具 Apr 26, 2025 am 12:09 AM

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

See all articles