<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
        主站蜘蛛池模板: 女人被弄到高潮的免费视频 | 亚洲美女视频一区二区三区| 亚洲国产精品特色大片观看完整版| 亚洲人成网7777777国产| 久久久久久亚洲精品| 亚洲码在线中文在线观看| 亚洲AV日韩综合一区尤物| 一级a性色生活片久久无少妇一级婬片免费放| 美女羞羞免费视频网站| 无码午夜成人1000部免费视频| 色影音免费色资源| vvvv99日韩精品亚洲| 亚洲一区二区三区高清| 深夜久久AAAAA级毛片免费看| 免费观看午夜在线欧差毛片| 亚洲男人第一av网站| 一级毛片正片免费视频手机看| 亚洲国产a级视频| 亚洲午夜无码毛片av久久京东热| 一个人看的www免费视频在线观看| 插B内射18免费视频| 好看的亚洲黄色经典| 美女隐私免费视频看| 国产亚洲无线码一区二区| 青青草无码免费一二三区| 亚洲综合色区在线观看| 亚洲日韩av无码中文| 免费A级毛片av无码| 亚洲一级在线观看| 日韩人妻一区二区三区免费| 亚洲国产高清美女在线观看| 日本免费久久久久久久网站| 国产亚洲av人片在线观看| 无遮挡国产高潮视频免费观看| 伊人婷婷综合缴情亚洲五月| 222www在线观看免费| 亚洲国产精品乱码一区二区 | 亚洲综合av一区二区三区不卡| 四虎永久免费观看| 18女人腿打开无遮掩免费| 日日摸日日碰夜夜爽亚洲|