<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
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        容易被忽略的JS腳本特性_javascript技巧

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

        容易被忽略的JS腳本特性_javascript技巧

        容易被忽略的JS腳本特性_javascript技巧:一、容易被忽略的局部變量 代碼如下: var a = 5; (function(){ alert(a); var a = a ++; alert(a); })() alert(a); 思考這段代碼的執行結果。 執行后,看看是否和你想象的一致? ok,這段代碼里核心的知識點是 var a = a++,其中兩個變量
        推薦度:
        導讀容易被忽略的JS腳本特性_javascript技巧:一、容易被忽略的局部變量 代碼如下: var a = 5; (function(){ alert(a); var a = a ++; alert(a); })() alert(a); 思考這段代碼的執行結果。 執行后,看看是否和你想象的一致? ok,這段代碼里核心的知識點是 var a = a++,其中兩個變量

        一、容易被忽略的局部變量
        代碼如下:
        var a = 5;
        (function(){
        alert(a);
        var a = a ++;
        alert(a);
        })()
        alert(a);

        思考這段代碼的執行結果。
        執行后,看看是否和你想象的一致?
        ok,這段代碼里核心的知識點是 var a = a++,其中兩個變量 a 都是匿名函數內部的局部變量,是同一個,和全局變量 a 是不一樣的。
        為什么?我們來看看ECMA規范對變量聲明語句的定義:
        代碼如下:
        Description
        If the variable statement occurs inside a FunctionDeclaration, the
        variables are defined with function-local scope in that function, as
        described in s10.1.3. Otherwise, they are defined with global scope
        (that is, they are created as members of the global object, as described
        in 10.1.3) using property attributes { DontDelete }. Variables are
        created when the execution scope is entered. A Block does not define a new
        execution scope. Only Program and FunctionDeclaration produce a new
        scope. Variables are initialised to undefined when created. A variable with
        an Initialiser is assigned the value of its AssignmentExpression when the
        VariableStatement is executed, not when the variable is created.

        聲明中提到:進入作用域環境后,變量就會被創建,并賦予初始值undefined。在變量聲明語句執行時才會把賦值表達式的值指派給該變量,而并不是在該變量被創建時。
        因此上面的代碼可以等價于:
        代碼如下:
        var a;
        a = 5;
        (function(){
        var a;
        alert(a);
        a = a ++;
        alert(a);
        })()
        alert(a);

        這樣應該會更容易理解了。
        二、容易被忽略的全局變量
        代碼如下:
        (function(){
        var a = b = 5;
        })()
        alert(b);

        這是玉伯幾天前分享到的知識點,蠻有意義的,在此也做個分析。
        首先,考慮執行結果為什么是:5。
        ok,原因出在 var a = b = 5 這句。
        為深入分析這個語句,我們繼續要參照ECMA規范對聲明語句的定義:
        var a = b = 5;等同為 var a; a = b = 5;兩條語句,后者是賦值表達式,其在ECMA中的定義是這樣的:
        代碼如下:
        Simple Assignment ( = )
        The production AssignmentExpression : LeftHandSideExpression =
        AssignmentExpression is evaluated as follows:
        1. Evaluate LeftHandSideExpression.
        2. Evaluate AssignmentExpression.
        3. Call GetValue(Result(2)).
        4. Call PutValue(Result(1), Result(3)).
        5. Return Result(3).

        對于a = b = 5;先執行左邊表達式 a,這是一個標識符表達式,根據規范第 10.1.4,其執行方式如下:
        代碼如下:
        During execution, the syntactic production PrimaryExpression : Identifier
        is evaluated using the following algorithm:
        1. Get the next object in the scope chain. If there isn't one, go to step 5.
        2. Call the [[HasProperty]] method of Result(1), passing the Identifier as
        the property.
        3. If Result(2) is true, return a value of type Reference whose base
        object is Result(1) and whose property name is the Identifier.
        4. Go to step 1.
        5. Return a value of type Reference whose base object is null and whose
        property name is the Identifier.

        搜尋作用域鏈,找到最近的一個 a 的引用,很明顯,在匿名函數內部作用域就可以找到,于是變量 a 確定下來。
        接著再執行右邊的表達式 b = 5 ,還是一個賦值表達式,重復賦值規則第一步,因為變量 b 在匿名函數環境內未聲明過,所以接著去 window 全局環境下去找 window.b ,被隱式聲明為全局變量,最后賦值為 5,根據規則第五步,表達式的結果也會再賦值給 a。最終達到 a 和 b 都為 5 ,區別是 a 是局部變量,而 b 是全局變量。
        我們再來理一下 (function(){var a = b = 5})() 表達式內部整體的執行順序:
        1.匿名函數內創建變量a;
        2.賦予初始值undefined;
        3.取得變量a的引用; //a
        4.取得變量b的引用; //window.b
        5.對數字5求值;
        6.賦值5給b的引用:window.b;
        7.返回b = 5的結果5給a的引用:a;
        8.返回a = 5的結果5;
        很明顯,中間的一個步驟使得變量 b 被聲明為全局變量,明白之后,我們不難找到代碼的優化點:只需將變量 b 顯式聲明為局部變量:
        代碼如下:
        (function(){
        var a,b;
        a = b = 5;
        })()

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

        文檔

        容易被忽略的JS腳本特性_javascript技巧

        容易被忽略的JS腳本特性_javascript技巧:一、容易被忽略的局部變量 代碼如下: var a = 5; (function(){ alert(a); var a = a ++; alert(a); })() alert(a); 思考這段代碼的執行結果。 執行后,看看是否和你想象的一致? ok,這段代碼里核心的知識點是 var a = a++,其中兩個變量
        推薦度:
        標簽: 小技巧 技巧 js
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲国产综合精品中文字幕| caoporn成人免费公开| 色偷偷女男人的天堂亚洲网| 亚洲一卡一卡二新区无人区| **一级一级毛片免费观看| 麻豆精品国产免费观看| 国产亚洲情侣一区二区无| 成人免费视频一区二区| 无码中文字幕av免费放| 亚洲人成7777| 国产免费怕怕免费视频观看| 亚洲国产精品久久66| 99免费观看视频| 亚洲午夜无码久久久久小说| 日韩免费高清视频| 国产精品无码永久免费888| 国产亚洲精品自在久久| 18gay台湾男同亚洲男同| 久久亚洲精品人成综合网| 99久久免费观看| 亚洲综合小说另类图片动图 | 全免费a级毛片免费看不卡| 亚洲日韩国产一区二区三区在线| 未满十八18禁止免费无码网站| 免费a在线观看播放| 一级特黄录像免费播放肥| 免费国产怡红院在线观看| 91在线视频免费观看| 18成禁人视频免费网站| 亚洲剧场午夜在线观看| 拔擦拔擦8x华人免费久久| 亚洲一区无码中文字幕乱码| 午夜免费啪视频在线观看| 国产亚洲日韩在线三区| 99re免费视频| 男女作爱免费网站| 亚洲精品人成电影网| 色综合久久精品亚洲国产| 国产亚洲精品国看不卡| 又黄又爽又成人免费视频| 免费人人潮人人爽一区二区|