整合營銷服務(wù)商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          JavaScript作用域例子1分析

          JavaScript作用域例子1分析

          面是2個作用域的題目,可以試著先做一遍,然后想想背后的原因。

          function foo(b) {

          var a=b;

          return {

          a: a,

          change: function(b) {

          console.log(a, b, this.a);

          a=a + b + this.a;

          },

          output: function() {

          console.log(a, this.a, b);

          }

          }

          }

          var x=foo(1);

          console.log('change before:')

          console.log(x.a); // 1;

          x.output(); // 1, 1, 1

          x.a=3;

          x.change(2); // 1, 2, 3

          console.log('after change:');

          console.log(x.a); // 3

          x.output(); // 6, 3, 1


          原因分析

          var x=foo(1); // 執(zhí)行后,x函數(shù)里面返回的對象,里面的屬性和值都在執(zhí)行過程中確定了,作用域范圍在代碼定義的位置。

          console.log('change before:')

          console.log(x.a); // 1;

          // x.a=1。因為foo()函數(shù)里面返回對象中屬性a被賦值為變量a,

          // 而變量a在foo(1)執(zhí)行時被賦值為b也就是1

          x.output();

          // a=1, this.a=1, b=1

          // a, output函數(shù)沒有變量a,通過作用域鏈向上查找, 父函數(shù)foo中有變量a

          // this.a, 函數(shù)執(zhí)行上下文的this指向函數(shù)的調(diào)用方也就是x對象,x被賦值為1

          // b, output也是通過作用域鏈向上查找到foo里的變量b,是foo里面的形參變量

          x.a=3;

          // 修改x.a為3,此時影響的只是x對象中的a屬性,并不影響foo函數(shù)作用域下a變量

          x.change(2);

          // a=1, b=2, this.a=3

          // a, 仍然是foo第一次被調(diào)用時的值,沒有被修改,仍然是1

          // b,這個b是change函數(shù)的形參變量,不是外部的b, b被賦值為2

          // this.a,此時this.a也就是x.a,已經(jīng)被修改為3

          // 執(zhí)行這句后,foo作用域下的a變量被賦值為a+b+this.a=1+2+3=6

          console.log('after change:');

          console.log(x.a); // 3

          // x.a沒有受到影響,依然是3

          x.output();

          // a=6, this.a=3, b=1

          // a在執(zhí)行change(2)時已經(jīng)被改成6了

          // this.a就是x.a,因此是3

          // b從output沿作用域開始查找,值仍是1,b沒有被改過

          以預(yù)估下結(jié)果,然后對比下答案

          let x=1,

          y=2;

          function foo(x) {

          let y=x;

          let obj={

          x: x++,

          y: --y,

          setXY: function(a, y) {

          y=x + a;

          console.log('setXY:', x, this.x, y, this.y);

          },

          getXY: function() {

          console.log('getXY:', x, this.x, y, this.y);

          return x;

          }

          }

          return obj;

          }

          let f=foo(3);

          f.setXY(x, y);

          f.getXY();

          console.log('outer:', x, f.x, y, f.y);

          // 打印結(jié)果:

          // setXY: x=4, this.x=3, y=5, this.y=2

          // getXY: x=4, this.x=3, y=2, this.y=2

          // outer: x=1, f.x=3, y=2, f.y=2

          本例子融合了靜態(tài)作用域、作用域鏈,以及i++、++i還有值傳遞為一體的例子。但并不繞,或者故意設(shè)置冗余的干擾。

          結(jié)果分析如下:

          let f=foo(3);

          // 定義f變量為foo(3)的執(zhí)行結(jié)果,返回 obj={x: 3, y:2, ...}

          // foo函數(shù)下有x形參變量,也定義了y變量并賦值為x,同時返回了obj對象

          // foo(3)在執(zhí)行時,形參變量x賦值為3,obj.x賦值為變量x++

          // 因為++在后,先賦值obj.x=x, 然后x再自增1。x變?yōu)?, obj.x仍是3

          // obj.y賦值為變量--y,先y減1,然后再將obj.y賦值為y的值,也就是obj.y=y=2

          f.setXY(x, y);

          // 調(diào)用setXY,傳入x,y參數(shù)。x與y都是全局的x,y,且x與y并沒有被修改過,因此傳入的是1,2

          // 首先y是自己作用域的形參變量,JS參數(shù)是值傳遞,因此傳入給變量y的是全局y的值2

          // 執(zhí)行y=x+a這句,此時x沿作用域鏈往上在foo里找到,x已自增為4, a是1,y=x+a=5

          // this.x也就是obj.x,還是之前執(zhí)行后的值3

          // this.y也就是obj.y,還是之前執(zhí)行后的值2

          f.getXY();

          // 調(diào)用getXY

          // x沿作用域鏈向上查找到foo下的x,也就是4

          // this.x是obj.x,還是3

          // y沿作用域鏈查找到foo下的y,仍是2,注意這個y不是setXY里面的那個y

          // this.y是obj.y,仍是2

          console.log('outer:', x, f.x, y, f.y);

          // 在最外部打印這四個對象

          // x是全局作用域下的x,且x沒有被干預(yù)過,仍然是1

          // y是全局作用域下的y, 也沒有被干預(yù)過,仍然是2,但不是foo里面的y

          // f.x是obj.x,還是3

          // f.y是obj.y,仍是2

          TML 屬性

          HTML 標(biāo)簽可以擁有屬性。屬性提供了有關(guān) HTML 元素的更多的信息。

          屬性總是以名稱/值對的形式出現(xiàn),比如:name="value"。

          屬性總是在 HTML 元素的開始標(biāo)簽中規(guī)定。

          屬性實例

          HTML 鏈接由 <a> 標(biāo)簽定義。鏈接的地址在 href 屬性中指定:

          [demo]

          <html>

          <head>

          <meta charset="UTF-8">

          </head>

          <body>

          <a >

          This is a link</a>

          </body>

          </html>

          [/demo]

          更多 HTML 屬性實例

          屬性例子 1:

          <h1> 定義標(biāo)題的開始。

          <h1 align="center"> 擁有關(guān)于對齊方式的附加信息。

          [demo]

          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

          "http://www.w3.org/TR/html4/loose.dtd">

          <html>

          <head>

          <meta charset="UTF-8">

          </head>

          <body>

          <h1 align="center">This is heading 1</h1>

          <p>上面的標(biāo)題在頁面中進行了居中排列。上面的標(biāo)題在頁面中進行了居中排列。上面的標(biāo)題在頁面中進行了居中排列。</p>

          </body>

          </html>

          [/demo]

          屬性例子 2:

          <body> 定義 HTML 文檔的主體。

          <body bgcolor="yellow"> 擁有關(guān)于背景顏色的附加信息。

          [demo]

          <html>

          <head>

          <meta charset="UTF-8">

          <meta http-equiv="Content-Type" content="text/html />

          <meta http-equiv="Content-Language" content="zh-cn" />

          </head>

          <body bgcolor="yellow">

          <h2>請看: 改變了顏色的背景。</h2>

          </body>

          </html>

          [/demo]

          屬性例子 3:

          <table> 定義 HTML 表格。(您將在稍后的章節(jié)學(xué)習(xí)到更多有關(guān) HTML 表格的內(nèi)容)

          <table border="1"> 擁有關(guān)于表格邊框的附加信息。

          HTML 提示:使用小寫屬性

          屬性和屬性值對大小寫不敏感。

          不過,萬維網(wǎng)聯(lián)盟在其 HTML 4 推薦標(biāo)準(zhǔn)中推薦小寫的屬性/屬性值。

          而新版本的 (X)HTML 要求使用小寫屬性。

          始終為屬性值加引號

          屬性值應(yīng)該始終被包括在引號內(nèi)。雙引號是最常用的,不過使用單引號也沒有問題。

          在某些個別的情況下,比如屬性值本身就含有雙引號,那么您必須使用單引號,例如:

          name='Bill "HelloWorld" Gates'

          下面列出了適用于大多數(shù) HTML 元素的屬性:

          屬性 值 描述

          class classname 規(guī)定元素的類名(classname)

          id id 規(guī)定元素的唯一 id

          style style_definition 規(guī)定元素的行內(nèi)樣式(inline style)

          title text 規(guī)定元素的額外信息(可在工具提示中顯示)

          HTML 全局屬性

          HTML 屬性賦予元素意義和語境。

          下面的全局屬性可用于任何 HTML 元素。

          HTML 全局屬性

          屬性 描述

          accesskey 規(guī)定激活元素的快捷鍵。

          class 規(guī)定元素的一個或多個類名(引用樣式表中的類)。

          contenteditable 規(guī)定元素內(nèi)容是否可編輯。

          contextmenu 規(guī)定元素的上下文菜單。上下文菜單在用戶點擊元素時顯示。

          data-* 用于存儲頁面或應(yīng)用程序的私有定制數(shù)據(jù)。

          dir 規(guī)定元素中內(nèi)容的文本方向。

          draggable 規(guī)定元素是否可拖動。

          dropzone 規(guī)定在拖動被拖動數(shù)據(jù)時是否進行復(fù)制、移動或鏈接。

          hidden 規(guī)定元素仍未或不再相關(guān)。

          id 規(guī)定元素的唯一 id。

          lang 規(guī)定元素內(nèi)容的語言。

          spellcheck 規(guī)定是否對元素進行拼寫和語法檢查。

          style 規(guī)定元素的行內(nèi) CSS 樣式。

          tabindex 規(guī)定元素的 tab 鍵次序。

          title 規(guī)定有關(guān)元素的額外信息。

          translate 規(guī)定是否應(yīng)該翻譯元素內(nèi)容。

          HTML 事件屬性

          Window 事件屬性

          針對 window 對象觸發(fā)的事件(應(yīng)用到 <body> 標(biāo)簽):

          屬性 值 描述

          onafterprint script 文檔打印之后運行的腳本。

          onbeforeprint script 文檔打印之前運行的腳本。

          onbeforeunload script 文檔卸載之前運行的腳本。

          onerror script 在錯誤發(fā)生時運行的腳本。

          onhaschange script 當(dāng)文檔已改變時運行的腳本。

          onload script 頁面結(jié)束加載之后觸發(fā)。

          onmessage script 在消息被觸發(fā)時運行的腳本。

          onoffline script 當(dāng)文檔離線時運行的腳本。

          ononline script 當(dāng)文檔上線時運行的腳本。

          onpagehide script 當(dāng)窗口隱藏時運行的腳本。

          onpageshow script 當(dāng)窗口成為可見時運行的腳本。

          onpopstate script 當(dāng)窗口歷史記錄改變時運行的腳本。

          onredo script 當(dāng)文檔執(zhí)行撤銷(redo)時運行的腳本。

          onresize script 當(dāng)瀏覽器窗口被調(diào)整大小時觸發(fā)。

          onstorage script 在 Web Storage 區(qū)域更新后運行的腳本。

          onundo script 在文檔執(zhí)行 undo 時運行的腳本。

          onunload script 一旦頁面已下載時觸發(fā)(或者瀏覽器窗口已被關(guān)閉)。

          Form 事件

          由 HTML 表單內(nèi)的動作觸發(fā)的事件(應(yīng)用到幾乎所有 HTML 元素,但最常用在 form 元素中):

          屬性 值 描述

          onblur script 元素失去焦點時運行的腳本。

          onchange script 在元素值被改變時運行的腳本。

          oncontextmenu script 當(dāng)上下文菜單被觸發(fā)時運行的腳本。

          onfocus script 當(dāng)元素失去焦點時運行的腳本。

          onformchange script 在表單改變時運行的腳本。

          onforminput script 當(dāng)表單獲得用戶輸入時運行的腳本。

          oninput script 當(dāng)元素獲得用戶輸入時運行的腳本。

          oninvalid script 當(dāng)元素?zé)o效時運行的腳本。

          onreset script 當(dāng)表單中的重置按鈕被點擊時觸發(fā)。HTML5 中不支持。

          onselect script 在元素中文本被選中后觸發(fā)。

          onsubmit script 在提交表單時觸發(fā)。

          Keyboard 事件

          屬性 值 描述

          onkeydown script 在用戶按下按鍵時觸發(fā)。

          onkeypress script 在用戶敲擊按鈕時觸發(fā)。

          onkeyup script 當(dāng)用戶釋放按鍵時觸發(fā)。

          Mouse 事件

          由鼠標(biāo)或類似用戶動作觸發(fā)的事件:

          屬性 值 描述

          onclick script 元素上發(fā)生鼠標(biāo)點擊時觸發(fā)。

          ondblclick script 元素上發(fā)生鼠標(biāo)雙擊時觸發(fā)。

          ondrag script 元素被拖動時運行的腳本。

          ondragend script 在拖動操作末端運行的腳本。

          ondragenter script 當(dāng)元素元素已被拖動到有效拖放區(qū)域時運行的腳本。

          ondragleave script 當(dāng)元素離開有效拖放目標(biāo)時運行的腳本。

          ondragover script 當(dāng)元素在有效拖放目標(biāo)上正在被拖動時運行的腳本。

          ondragstart script 在拖動操作開端運行的腳本。

          ondrop script 當(dāng)被拖元素正在被拖放時運行的腳本。

          onmousedown script 當(dāng)元素上按下鼠標(biāo)按鈕時觸發(fā)。

          onmousemove script 當(dāng)鼠標(biāo)指針移動到元素上時觸發(fā)。

          onmouseout script 當(dāng)鼠標(biāo)指針移出元素時觸發(fā)。

          onmouseover script 當(dāng)鼠標(biāo)指針移動到元素上時觸發(fā)。

          onmouseup script 當(dāng)在元素上釋放鼠標(biāo)按鈕時觸發(fā)。

          onmousewheel script 當(dāng)鼠標(biāo)滾輪正在被滾動時運行的腳本。

          onscroll script 當(dāng)元素滾動條被滾動時運行的腳本。

          Media 事件

          由媒介(比如視頻、圖像和音頻)觸發(fā)的事件(適用于所有 HTML 元素,但常見于媒介元素中,比如 <audio>、<embed>、<img>、<object> 以及 <video>):

          屬性 值 描述

          onabort script 在退出時運行的腳本。

          oncanplay script 當(dāng)文件就緒可以開始播放時運行的腳本(緩沖已足夠開始時)。

          oncanplaythrough script 當(dāng)媒介能夠無需因緩沖而停止即可播放至結(jié)尾時運行的腳本。

          ondurationchange script 當(dāng)媒介長度改變時運行的腳本。

          onemptied script 當(dāng)發(fā)生故障并且文件突然不可用時運行的腳本(比如連接意外斷開時)。

          onended script 當(dāng)媒介已到達結(jié)尾時運行的腳本(可發(fā)送類似“感謝觀看”之類的消息)。

          onerror script 當(dāng)在文件加載期間發(fā)生錯誤時運行的腳本。

          onloadeddata script 當(dāng)媒介數(shù)據(jù)已加載時運行的腳本。

          onloadedmetadata script 當(dāng)元數(shù)據(jù)(比如分辨率和時長)被加載時運行的腳本。

          onloadstart script 在文件開始加載且未實際加載任何數(shù)據(jù)前運行的腳本。

          onpause script 當(dāng)媒介被用戶或程序暫停時運行的腳本。

          onplay script 當(dāng)媒介已就緒可以開始播放時運行的腳本。

          onplaying script 當(dāng)媒介已開始播放時運行的腳本。

          onprogress script 當(dāng)瀏覽器正在獲取媒介數(shù)據(jù)時運行的腳本。

          onratechange script 每當(dāng)回放速率改變時運行的腳本(比如當(dāng)用戶切換到慢動作或快進模式)。

          onreadystatechange script 每當(dāng)就緒狀態(tài)改變時運行的腳本(就緒狀態(tài)監(jiān)測媒介數(shù)據(jù)的狀態(tài))。

          onseeked script 當(dāng) seeking 屬性設(shè)置為 false(指示定位已結(jié)束)時運行的腳本。

          onseeking script 當(dāng) seeking 屬性設(shè)置為 true(指示定位是活動的)時運行的腳本。

          onstalled script 在瀏覽器不論何種原因未能取回媒介數(shù)據(jù)時運行的腳本。

          onsuspend script 在媒介數(shù)據(jù)完全加載之前不論何種原因終止取回媒介數(shù)據(jù)時運行的腳本。

          ontimeupdate script 當(dāng)播放位置改變時(比如當(dāng)用戶快進到媒介中一個不同的位置時)運行的腳本。

          onvolumechange script 每當(dāng)音量改變時(包括將音量設(shè)置為靜音)時運行的腳本。

          onwaiting script 當(dāng)媒介已停止播放但打算繼續(xù)播放時(比如當(dāng)媒介暫停已緩沖更多數(shù)據(jù))運行腳本


          主站蜘蛛池模板: 国产萌白酱在线一区二区| 在线播放精品一区二区啪视频| 国精产品一区二区三区糖心| 国产韩国精品一区二区三区久久 | 久久久久人妻精品一区| 搜日本一区二区三区免费高清视频 | 亚洲一区二区三区高清不卡| 久久se精品一区精品二区国产| 欧美日韩国产免费一区二区三区| 久久99精品波多结衣一区| 一区二区三区免费视频观看| 精品国产一区二区三区久久狼 | 日本中文字幕在线视频一区| 久久久无码精品人妻一区| 久久精品岛国av一区二区无码| 国产成人片视频一区二区| 精品一区二区久久久久久久网精| 91午夜精品亚洲一区二区三区| 国产亚洲3p无码一区二区| 一区二区国产精品| 动漫精品一区二区三区3d| 久热国产精品视频一区二区三区| 91精品国产一区二区三区左线| 另类一区二区三区| 夜夜添无码一区二区三区| 中文字幕一区二区日产乱码| 亚洲成人一区二区| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 久久久久人妻精品一区二区三区| 综合人妻久久一区二区精品| 果冻传媒一区二区天美传媒| 国产一区在线电影| 精品中文字幕一区在线| 日韩精品无码Av一区二区| 无码少妇A片一区二区三区| 亚洲AV日韩AV一区二区三曲| 无码人妻久久一区二区三区免费丨| 久久精品国产一区| 久久精品亚洲一区二区| 亚洲码一区二区三区| 无码国产精品一区二区免费式直播|