<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
        主站蜘蛛池模板: 亚洲91av视频| 五月婷婷亚洲综合| 亚洲综合一区二区国产精品| 成人免费777777被爆出| 中国亚洲女人69内射少妇| www一区二区www免费| 亚洲Av综合色区无码专区桃色 | 麻豆国产精品免费视频| 亚洲网址在线观看你懂的| 97免费人妻无码视频| 亚洲色欲啪啪久久WWW综合网| 啦啦啦高清视频在线观看免费 | 久章草在线精品视频免费观看| 久久亚洲国产精品| 曰批全过程免费视频播放网站| 亚洲午夜在线播放| 亚洲av高清在线观看一区二区 | 亚洲国产精品线在线观看| 91人成网站色www免费下载| 亚洲春色在线观看| 日本免费电影一区| 国产成人AV免费观看| 亚洲免费视频网址| 亚洲国产av无码精品| 无码AV片在线观看免费| 亚洲熟妇AV乱码在线观看| 亚洲国产日韩成人综合天堂| 免费萌白酱国产一区二区三区| 亚洲国产成人久久| 亚洲成a人片在线观看久| 久久国产精品免费专区| 亚洲成熟丰满熟妇高潮XXXXX| 在线日韩日本国产亚洲| 国产在线观看麻豆91精品免费 | 91热久久免费精品99| 亚洲jizzjizz少妇| 久久精品国产亚洲| 白白国产永久免费视频| 国产免费无码AV片在线观看不卡| 亚洲综合激情五月丁香六月| 亚洲夜夜欢A∨一区二区三区|