<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        深入理解javascript嚴格模式(StrictMode)_javascript技巧

        來源:懂視網 責編:小采 時間:2020-11-27 21:29:24
        文檔

        深入理解javascript嚴格模式(StrictMode)_javascript技巧

        深入理解javascript嚴格模式(StrictMode)_javascript技巧:ECMAScript5中引入的嚴格模式,通過讓JavaScript運行環境對一些開發過程中最常見和不易發現的錯誤做出和當前不同的處理,來讓開發者擁有一個更好的JavaScript語言。很長一段時間內,由于只有Firefox支持嚴格模式,我曾對嚴格模式表示懷疑。但到了今天,所有主
        推薦度:
        導讀深入理解javascript嚴格模式(StrictMode)_javascript技巧:ECMAScript5中引入的嚴格模式,通過讓JavaScript運行環境對一些開發過程中最常見和不易發現的錯誤做出和當前不同的處理,來讓開發者擁有一個更好的JavaScript語言。很長一段時間內,由于只有Firefox支持嚴格模式,我曾對嚴格模式表示懷疑。但到了今天,所有主

        ECMAScript5中引入的嚴格模式,通過讓JavaScript運行環境對一些開發過程中最常見和不易發現的錯誤做出和當前不同的處理,來讓開發者擁有一個”更好”的JavaScript語言。很長一段時間內,由于只有Firefox支持嚴格模式,我曾對嚴格模式表示懷疑。但到了今天,所有主流的瀏覽器都在他們的最新版本中支持了嚴格模式(包括IE10,Opera12和Android4,IOS5)是時候開始使用嚴格模式了。

        嚴格模式能起到什么作用?

        嚴格模式為JavaScript引入了很多變化,我把他們分為兩類(明顯的和細微的)。細微改進的目標是修復當前JavaScript中的一些細節問題,對于這些問題我不在這里進行深入介紹;如果你有興趣,請閱讀Dmitry Soshnikov撰寫的精彩文檔ECMA-262-5 in Detail Chapter 2 Strict Mode。 我在這里主要介紹嚴格模式引入的明顯變化,那些在你使用嚴格模式前應該知道的概念和那些對你幫助最大的改變。

        在開始學習具體特性前,請記住嚴格模式的一大目標是讓你能更快更方便的調試。運行環境在發現問題時顯性的拋出錯誤比默不做聲的失敗或怪異行事(未開啟嚴格模式的JavaScript運行環境經常這樣)要好。嚴格模式會拋出更多錯誤,但這是好事,因為這些錯誤會喚起你注意并修復很多以前很難被發現的潛在問題。

        去除WITH關鍵詞

        首先,嚴格模式中去除了with語句,包含with語句的代碼在嚴格模式中會拋出異常。所以使用嚴格模式的第一步:確保你的代碼中沒有使用with。

        代碼如下:
        // 在嚴格模式中以下JavaScript代碼會拋出錯誤
        with (location) {
        alert(href);
        }

        防止意外為全局變量賦值

        其次,局部變量在賦值前必須先進行申明。在啟用嚴格模式之前,為一個未申明的局部變量復制時會自動創建一個同名全局變量。這是Javacript程序中最容易出現的錯誤之一, 在嚴格模式中嘗試這么做時會有顯性的異常拋出。

        代碼如下:
        // 嚴格模式下會拋出異常
        (function() {
        someUndeclaredVar = "foo";
        }());

        函數中的THIS不再默認指向全局

        嚴格模式中另一個重要的變化是函數中未被定義或為空( null or undefined)的this不在默認指向全局環境(global)。這會造成一些依賴函數中默認this行為的代碼執行出錯,例如:

        代碼如下:
        window.color = "red";
        function sayColor() {
        alert(this.color);
        }
        // 在strict模式中會報錯, 如果不在嚴格模式中則提示 “red"
        sayColor();
        // 在strict模式中會報錯, 如果不在嚴格模式中則提示 “red"
        sayColor.call(null);

        this在被賦值之前會一直保持為undefined,這意味著當一個構造函數在執行時,如果之前沒有明確的new關鍵詞,會拋出異常。

        代碼如下:
        function Person(name) {
        this.name = name;
        }
        //在嚴格模式中會報錯
        var me = Person("Nicholas");

        在上面的代碼中,Person構造函數運行時因為之前沒有new,函數中的this會保留為undefined, 由于你不能為undefined設置屬性,上面的代碼會拋出錯誤。 在非strict模式環境中,沒有被復制的this會默認指向window全局變量,運行的結果將是意外的為window全局變量設置name屬性。

        防止重名

        當編寫大量代碼時,對象屬性和函數參數很容易一不小心被設置成一個重復的名字。嚴格模式在這種情況下會顯性的拋出錯誤

        代碼如下:
        //重復的變量名,在嚴格模式下會報錯
        function doSomething(value1, value2, value1) {
        //code
        }
        //重復的對象屬性名,在嚴格模式下會報錯:
        var object = {
        foo: "bar",
        foo: "baz"
        };

        以上的代碼在嚴格模式中都會被認為是語法錯誤而在執行前就讓你能得到提示。

        安全的 EVAL()

        雖然eval()語句最終沒有被移除,但在嚴格模式中仍然對它進行了一些改進。最大的改變是在eval()中執行的變量和函數申明不會直接在當前作用域中創建相應變量或函數,例如:

        代碼如下:
        (function() {
        eval("var x = 10;");
        // 非嚴格模式中,alert 10
        // 嚴格模式中則因x未被定義而拋出異常,
        alert(x);
        }());

        任何在eval()執行過程中創建的變量或者函數保留在eval()中。但你能明確的從eval()語句的返回值來獲取eval()中的執行結果,例如:

        代碼如下:
        (function() {
        var result = eval("var x = 10, y = 20; x + y");
        // 在strict或非strict模式中都能正確的運行余下的語句.(resulst為30)
        alert(result);
        }());

        對只讀屬性修改時拋出異常

        ECMAScript5中還引入為對象的特定屬性設為只讀,或讓整個對象不可修改的能力。 但在非嚴格模式中,嘗試修改一個只讀屬性只會默不做聲的失敗。 在你和一些瀏覽器原生API打交道過程中,你很可能遇到這種情況。嚴格模式會在這種情況下明確的拋出異常,提醒你修改這個屬性是不被允許的。

        代碼如下:
        var person = {};
        Object.defineProperty(person, "name" {
        writable: false,
        value: "Nicholas"
        });
        // 在非嚴格模式時,沉默的失敗,在嚴格模式則拋出異常.
        person.name = "John";

        上面的例子中,name屬性被設為只讀,非嚴格模式中執行對name屬性的修改不會引發報錯,但修改不會成功。但嚴格模式則會明確的拋出異常。

        NOTE: 強烈建議你在使用任何ECMAScript屬性特性指定時開啟嚴格模式。

        如何使用?

        在現代瀏覽器中開啟嚴格模式非常容易,只需要在JavaScript代碼中出現以下指令即可

        "use strict";

        雖然看上去上面的代碼僅僅只是未賦予某個變量的字符串,它實際上起到指示JavaScript引擎切換到嚴格模式的作用(不支持嚴格模式的瀏覽器會忽略以上代碼,不會對后續的執行產生任何影響)。雖然你能把這個指令作用到全局或某個函數中,但這里還是要提醒,不要在全局環境下啟用嚴格模式。

        代碼如下:
        // 請不要這么使用
        "use strict";
        function doSomething() {
        // 這部分代碼會運行于嚴格模式
        }
        function doSomethingElse() {
        // 這部分代碼也會運行于嚴格模式
        }


        雖然上面的代碼看起來不算一個大問題。但當你不負責維護頁面中引入的全部代碼時,這樣使用strict模式會讓你面臨由于第三方代碼沒有為嚴格模式做好準備而引發的問題。

        因此,最好把開啟嚴格模式的指令作用于函數中,例如:

        代碼如下:
        function doSomething() {
        "use strict";
        // 這個函數中的代碼將會運行于嚴格模式
        }
        function doSomethingElse() {
        // 這個函數中代碼不會運行于嚴格模式
        }


        如果你想讓嚴格模式在不止一個函數中開啟,請使用立即執行函數表達式 (immediately-invoked function expression ,IIFE):

        代碼如下:
        (function() {
        "use strict";
        function doSomething() {
        // 這個函數運行于嚴格模式
        }
        function doSomethingElse() {
        // 這個函數同樣運行于嚴格模式
        }
        }());

        結論

        我強烈建議你從現在開始就啟用JavaScript嚴格模式,它能幫你發現代碼中未曾注意到的錯誤。不要在全局環境中啟用,但你能盡量多的使用IIFE(立即執行函數表達式)來把嚴格模式作用到多個函數范圍內。一開始,你會遇到之前未曾碰到過的錯誤提示,這是正常的。當啟用嚴格模式后,請確保在支持的瀏覽器中做了測試,以發現新的潛在問題。一定不要僅僅在代碼中添加一行”use strict”就假定余下的代碼能正常工作。最后,請在嚴格模式下開始編寫更好的代碼。

        注:
        這里有各款瀏覽器對嚴格模式支持情況的一個匯總。
        可以在這個頁面對當前瀏覽器的嚴格模式支持度進行測試。

        嚴格模式的優勢:

        使JavaScript更牢固
        1. This不再被封裝,在normal mode下,this一直是對象。
        2. Fun.caller和fun.arguments即不是可以刪除的屬性,也不能被set或retrieved。
        3. Arguments.caller也是不可以刪除的屬性,也不能set或retrieved。

        為將來的ECMAScript版本鋪平道路
        1. 增加了下列保留字:implements, interface, let,package, private, protected, public, static和yield 。
        2. 方法聲明應該放在腳本或方法的最前面,不能放在if或for等語句中間。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        深入理解javascript嚴格模式(StrictMode)_javascript技巧

        深入理解javascript嚴格模式(StrictMode)_javascript技巧:ECMAScript5中引入的嚴格模式,通過讓JavaScript運行環境對一些開發過程中最常見和不易發現的錯誤做出和當前不同的處理,來讓開發者擁有一個更好的JavaScript語言。很長一段時間內,由于只有Firefox支持嚴格模式,我曾對嚴格模式表示懷疑。但到了今天,所有主
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 人妻免费久久久久久久了| 亚洲免费在线视频| 亚洲av永久无码天堂网| 亚洲精品免费在线| 亚洲综合一区无码精品| 在线观看成人免费视频不卡| 亚洲高清在线播放| 2020久久精品亚洲热综合一本| 亚洲成a人片在线观看天堂无码| 国产免费不卡视频| 亚洲网红精品大秀在线观看| 亚洲真人无码永久在线观看| 男女超爽刺激视频免费播放 | 99ee6热久久免费精品6| 亚洲av永久无码精品漫画 | 亚洲精品网站在线观看你懂的| 中文字幕高清免费不卡视频| 亚洲中文字幕无码久久综合网| 91成人免费福利网站在线| 国产黄色一级毛片亚洲黄片大全| 边摸边吃奶边做爽免费视频网站| 免费一级特黄特色大片在线观看| 国产成人综合亚洲绿色| 亚洲伊人久久综合影院| 未满十八18禁止免费无码网站| 亚洲精品亚洲人成在线观看下载| 国产99久久久国产精免费| 久久久无码精品亚洲日韩蜜桃| 久热免费在线视频| 国产成人精品日本亚洲11| 亚洲精品综合久久| 久久aⅴ免费观看| 中文字幕在线日亚洲9| 91福利免费视频| 亚洲伦理中文字幕| 亚洲精品无码你懂的网站| 午夜不卡久久精品无码免费| 中文字幕乱码亚洲无线三区 | 大胆亚洲人体视频| 国产高清不卡免费视频| 亚洲成av人片天堂网无码】|