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

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

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

      深入理解JavaScript系列(11):執行上下文(Execution Contexts)

      2012-01-13 09:00  湯姆大叔  閱讀(43418)  評論(24)    收藏  舉報

      簡介

      從本章開始,我將陸續(翻譯、轉載、整理)http://dmitrysoshnikov.com/網站關于ECMAScript標標準理解的好文。

      本章我們要講解的是ECMAScript標準里的執行上下文和相關可執行代碼的各種類型。

      原始作者:Dmitry A. Soshnikov
      原始發布: 2009-06-26
      俄文原文:http://dmitrysoshnikov.com/ecmascript/ru-chapter-1-execution-contexts/

      英文翻譯:Dmitry A. Soshnikov.
      發布時間:2010-03-11
      英文翻譯:http://dmitrysoshnikov.com/ecmascript/chapter-1-execution-contexts/

      本文參考了博客園justinw的中文翻譯,做了一些錯誤修正,感謝譯者。

      定義

      每次當控制器轉到ECMAScript可執行代碼的時候,即會進入到一個執行上下文。執行上下文(簡稱-EC)是ECMA-262標準里的一個抽象概念,用于同可執行代碼(executable code)概念進行區分。

      標準規范沒有從技術實現的角度定義EC的準確類型和結構,這應該是具體實現ECMAScript引擎時要考慮的問題。

      活動的執行上下文組在邏輯上組成一個堆棧。堆棧底部永遠都是全局上下文(global context),而頂部就是當前(活動的)執行上下文。堆棧在EC類型進入和退出上下文的時候被修改(推入或彈出)。

      可執行代碼類型

      可執行代碼的類型這個概念與執行上下文的抽象概念是有關系的。在某些時刻,可執行代碼與執行上下文完全有可能是等價的。

      例如,我們可以定義執行上下文堆棧是一個數組:

      ECStack = [];

      每次進入function (即使function被遞歸調用或作為構造函數) 的時候或者內置的eval函數工作的時候,這個堆棧都會被壓入。

      全局代碼

      這種類型的代碼是在"程序"級處理的:例如加載外部的js文件或者本地<script></script>標簽內的代碼。全局代碼不包括任何function體內的代碼。

      在初始化(程序啟動)階段,ECStack是這樣的:

      ECStack = [
      globalContext
      ];

      函數代碼

      當進入funtion函數代碼(所有類型的funtions)的時候,ECStack被壓入新元素。需要注意的是,具體的函數代碼不包括內部函數(inner functions)代碼。如下所示,我們使函數自己調自己的方式遞歸一次:

      (function  foo(bar) {
      if (bar) {
      return;
      }
      foo(true);
      })();

      那么,ECStack以如下方式被改變:

      // 第一次foo的激活調用
      ECStack = [
      <foo> functionContext
      globalContext
      ];

      // foo的遞歸激活調用
      ECStack = [
      <foo> functionContext – recursively
      <foo> functionContext
      globalContext
      ];

      每次return的時候,都會退出當前執行上下文的,相應地ECStack就會彈出,棧指針會自動移動位置,這是一個典型的堆棧實現方式。一個拋出的異常如果沒被截獲的話也有可能從一個或多個執行上下文退出。相關代碼執行完以后,ECStack只會包含全局上下文(global context),一直到整個應用程序結束。

      Eval 代碼

      eval 代碼有點兒意思。它有一個概念: 調用上下文(calling context),例如,eval函數調用的時候產生的上下文。eval(變量或函數聲明)活動會影響調用上下文(calling context)。

      eval('var x = 10');

      (function foo() {
      eval('var y = 20');
      })();

      alert(x); // 10
      alert(y); // "y" 提示沒有聲明

      ECStack的變化過程:

      ECStack = [
      globalContext
      ];

      // eval('var x = 10');
      ECStack.push(
      evalContext,
      callingContext: globalContext
      );

      // eval exited context
      ECStack.pop();

      // foo funciton call
      ECStack.push(<foo> functionContext);

      // eval('var y = 20');
      ECStack.push(
      evalContext,
      callingContext: <foo> functionContext
      );

      // return from eval
      ECStack.pop();

      // return from foo
      ECStack.pop();

      也就是一個非常普通的邏輯調用堆棧。

      在版本號1.7以上的SpiderMonkey(內置于Firefox,Thunderbird)的實現中,可以把調用上下文作為第二個參數傳遞給eval。那么,如果這個上下文存在,就有可能影響“私有”(有人喜歡這樣叫它)變量。

      function foo() {
      var x = 1;
      return function () { alert(x); };
      };

      var bar = foo();

      bar(); // 1

      eval('x = 2', bar); // 傳入上下文,影響了內部的var x 變量

      bar(); // 2

      結論

      這篇文章是后面分析其他跟執行上下文相關的主題(例如變量對象,作用域鏈,等等)的最起碼的理論基礎,這些主題將在后續章節中講到。

      其他參考

      這篇文章的內容在ECMA-262-3 標準規范中對應的章節— 10. Execution Contexts.

      同步與推薦

      本文已同步至目錄索引:深入理解JavaScript系列

      深入理解JavaScript系列文章,包括了原創,翻譯,轉載等各類型的文章,如果對你有用,請推薦支持一把,給大叔寫作的動力。

      主站蜘蛛池模板: 国产欧美亚洲精品第一页在线| 亚洲一区二区三区在线播放无码 | 好紧好湿太硬了我太爽了视频| 国产视频 视频一区二区| 麻豆一区二区三区精品视频| 加勒比无码人妻东京热| 日韩加勒比一本无码精品| 精品国产乱码久久久久APP下载| 天天拍夜夜添久久精品大| 国产午夜鲁丝片av无码| 乱老年女人伦免费视频| 亚洲中文字幕国产精品| 成人视频在线观看| 中文字幕久久人妻熟人妻| 4hu44四虎www在线影院麻豆| 欧洲无码一区二区三区在线观看| 九九热视频免费在线播放| 东京热一精品无码av| 成人免费看片又大又黄| 狠狠躁夜夜人人爽天96| 四虎国产精品永久入口| 国产精品涩涩涩视频网站| 99在线视频免费观看| 亚洲国产精品成人综合久| 国产av一区二区午夜福利| 欧美黑吊大战白妞| 亚洲男人天堂东京热加勒比| 亚洲熟妇在线视频观看| 性欧美乱熟妇xxxx白浆| 久久热这里只有精品国产| 最近免费中文字幕大全| 免费国产高清在线精品一区| 九九热免费精品在线视频| 18无码粉嫩小泬无套在线观看| 国产成人精品久久一区二区 | 久久久久久久久久久久中文字幕| 最近2019免费中文字幕8| 国产不卡av一区二区| 成人午夜免费无码视频在线观看| 偷窥国产亚洲免费视频| 亚洲日韩久热中文字幕|