<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      [JS] 動態(tài)執(zhí)行JS與修改詞法作用域

      相關(guān)可行的操作

      1. eval: 同步執(zhí)行,當(dāng)前作用域;
      2. setTimeout: 異步執(zhí)行,全局作用域;

      第1個參數(shù)可以傳入函數(shù)對象,也可以傳入字符串,即要執(zhí)行的代碼。

      1. script: 同步執(zhí)行,全局作用域;

      創(chuàng)建script標(biāo)簽,并設(shè)置innerHTML為要執(zhí)行的代碼。

      1. Function: 同步執(zhí)行,全局作用域。

      Function構(gòu)造函數(shù)可以傳入字符串,生成一個函數(shù)對象。


      對詞法作用域的影響

      eval

      eval可以通過動態(tài)地執(zhí)行JS代碼從而修改(欺騙)當(dāng)前的詞法作用域,觀察如下代碼:

      function foo(str, a){
          eval(str);
          console.log(a, b);
      }
      var b = 2;
      foo("var b=3;", 1); // 1, 3
      

      在函數(shù)中,執(zhí)行eval(..)var b=3;帶入該詞法作用域,導(dǎo)致console.log(..)中對b的右值引用找到的是3,而不會查詢到外部的b=2。

      在默認(rèn)情況下,eval會對所處的詞法作用域進(jìn)行修改。
      嚴(yán)格模式下,eval在運(yùn)行時有其自己的詞法作用域,即其動態(tài)執(zhí)行的JS聲明語句不會影響到eval語句所處的詞法作用域。

      function foo(str){
          "use strict";
          eval(str);
          console.log(a); // ReferenceError: a is not defined
      }
      foo("var a = 2;");
      

      with

      除了eval另外可以修改詞法作用域的語法是with關(guān)鍵字。

      function foo(obj){
          with(obj){
              a = 2;
          }
      }
      
      var o1 = {a: 3};
      var o2 = {b: 3};
      
      foo(o1);
      console.log(o1.a);  // 2
      foo(o2);
      console.log(o2.a); // undefined
      console.log(a); // 2 (a被泄露到全局作用域了)
      

      with接受一個對象,并將這個對象處理為一個完全隔離的詞法作用域,這個對象的屬性會被處理為定義在這個作用域內(nèi)的詞法標(biāo)識符。
      所以當(dāng)o1傳遞給with時,with聲明的作用域是o1,包含了同o1.a對應(yīng)的標(biāo)識符a,這個左值引用可以找到目標(biāo),并成功完成賦值操作。
      當(dāng)o2傳遞給with時,with聲明的詞法作用域會包含同o2.b對應(yīng)的標(biāo)識符b,但是沒有標(biāo)識符a,此時賦值操作會進(jìn)行LHS標(biāo)識符查詢,向外層作用域查找。
      由于在o2的作用域、foo的函數(shù)作用域、全局作用域都沒有找到標(biāo)識符a,因此當(dāng)a = 2執(zhí)行時,會在全局作用域自動創(chuàng)建一個全局變量(如果是嚴(yán)格模式則不會)。

      性能問題

      JS引擎會在編譯階段進(jìn)行性能優(yōu)化,其中部分優(yōu)化依賴于根據(jù)代碼的詞法進(jìn)行靜態(tài)分析,并預(yù)先確定所有變量和函數(shù)的定義位置,才能在執(zhí)行過程中快速找到標(biāo)識符。
      evalwith這種可能動態(tài)更改詞法作用域的操作會導(dǎo)致JS引擎無法在詞法分析階段明確標(biāo)識符的位置,因此所有優(yōu)化可能都是無意義的,甚至JS引擎可能在讀取代碼中使用了evalwith,就放棄優(yōu)化了。
      因此,在開發(fā)中應(yīng)該避免使用evalwith。

      引用

      [1] Scope and Closures, Kyle Simpson著(O'Reilly, 2014) 978-1-491-33558-8。

      posted @ 2024-06-17 13:29  feixianxing  閱讀(118)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 妺妺窝人体色www看美女| 天干天干啦夜天干天2017| 欧美成人无码a区视频在线观看| 亚洲婷婷综合色高清在线| 国产精品毛片在线看不卡| 精品国产福利久久久| 天堂V亚洲国产V第一次| 国内精品九九久久久精品| 亚洲成人av在线资源| 国产高清在线a视频大全| 国产激情文学亚洲区综合| 日本一区二区三区黄色网| 啊灬啊灬啊灬快灬高潮了电影片段| 亚洲国产性夜夜综合| 国产精品人妇一区二区三区| 欧美精品一产区二产区| 欧美黑人XXXX性高清版| 亚洲精品免费一二三区| 极品无码国模国产在线观看| 久久久久国产一级毛片高清版A| 成人看的污污超级黄网站免费| 久久国产热这里只有精品| 欧洲精品色在线观看| 高清偷拍一区二区三区| 2020国产成人精品视频| 国产精品制服丝袜无码| 国产精品午夜福利合集| 农村老熟女一区二区三区| 精品无码三级在线观看视频 | 天天摸天天碰天天添| 亚洲成AV人片在线观高清| 国产乱子伦视频在线播放| 国产亚洲精品第一综合| 强伦姧人妻免费无码电影| 377P欧洲日本亚洲大胆| 国产av综合色高清自拍| 国产精品户外野外| 亚洲国产午夜精品福利| 日本偷拍自影像视频久久| 国产亚洲欧美精品久久久| 亚洲精品综合一区二区三区|