1992年Nombas開發出C-minus-minus(C--)的嵌入式腳本語言(最初綁定在CEnvi軟件中).後將其更名ScriptEase.(客戶端執行的語言)css
Netscape(網景)接收Nombas的理念,(Brendan Eich)在其Netscape Navigator 2.0產品中開發出一套livescript的腳本語言.Sun和Netscape共同完成.後更名叫Javascripthtml
微軟隨後模仿在其IE3.0的產品中搭載了一個JavaScript的克隆版叫Jscript.前端
爲了統一三家,ECMA(歐洲計算機制造協會)定義了ECMA-262規範.國際標準化組織及國際電工委員會(ISO/IEC)也採納 ECMAScript 做爲標準(ISO/IEC-16262)。今後,Web 瀏覽器就開始努力(雖然有着不一樣的程度的成功和失敗)將 ECMAScript 做爲 JavaScript 實現的基礎。EcmaScript是規範.java
儘管 ECMAScript 是一個重要的標準,但它並非 JavaScript 惟一的部分,固然,也不是惟一被標準化的部分。實際上,一個完整的 JavaScript 實現是由如下 3 個不一樣部分組成的:node
簡單地說,ECMAScript 描述瞭如下內容:python
1 直接編寫
<script> alert('hello yuan') </script> 2 導入文件 <script src="hello.js"></script>
1
2
3
|
x=5
y=6
z=x+y
|
在代數中,咱們使用字母(好比 x)來保存值(好比 5)。經過上面的表達式 z=x+y,咱們可以計算出 z 的值爲 11。在 JavaScript 中,這些字母被稱爲變量。數組
那麼如何在JS中定義使用變量呢?瀏覽器
一、聲明變量時不用聲明變量類型. 全都使用var關鍵字;app
1
|
var
a;<br>a=3;
|
二、一行能夠聲明多個變量.而且能夠是不一樣類型
1
|
var
name=
"yuan"
, age=20, job=
"lecturer"
;
|
三、聲明變量時 能夠不用var. 若是不用var 那麼它是全局變量
四、變量命名,首字符只能是字母,下劃線,$美圓符 三選一,餘下的字符能夠是下劃線、美圓符號或任何字母或數字字符且區分大小寫,x與X是兩個變量
常量 :直接在程序中出現的數據值
標識符:
/* number ----- 數值 boolean ----- 布爾值 string ----- 字符串 undefined ----- undefined null ----- null *
整數:
在JavaScript中10進制的整數由數字的序列組成
精確表達的範圍是
-9007199254740992 (-253) 到 9007199254740992 (253)
超出範圍的整數,精確度將受影響
浮點數:
使用小數點記錄數據
例如:3.4,5.6
使用指數記錄數據
例如:4.3e23 = 4.3 x 1023
16進制和8進制數的表達:
16進制數據前面加上0x,八進制前面加0;16進制數是由0-9,A-F等16個字符組成;8進制數由0-7等8個數字組成
16進制和8進制與2進制的換算:
1
2
|
2進制: 1111 0011 1101 0100 <-----> 16進制:0xF3D4 <-----> 10進制:62420
2進制: 1 111 001 111 010 100 <-----> 8進制:0171724
|
是由Unicode字符、數字、標點符號組成的序列;字符串常量首尾由單引號或雙引號括起;JavaScript中沒有字符類型;經常使用特殊字符在字符串中的表達;
字符串中部分特殊字符必須加上右劃線\;經常使用的轉義字符 \n:換行 \':單引號 \":雙引號 \\:右劃線
Boolean類型僅有兩個值:true和false,也表明1和0,實際運算中true=1,false=0
布爾值也能夠看做on/off、yes/no、1/0對應true/false
Boolean值主要用於JavaScript的控制語句,例如:
if (x==1){ y=y+1; }else{ y=y-1; }
Undefined類型
Undefined 類型只有一個值,即 undefined。當聲明的變量未初始化時,該變量的默認值是 undefined。
當函數無明確返回值時,返回的也是值 "undefined";
Null類型
另外一種只有一個值的類型是 Null,它只有一個專用值 null,即它的字面量。值 undefined 其實是從值 null 派生來的,所以 ECMAScript 把它們定義爲相等的。
儘管這兩個值相等,但它們的含義不一樣。undefined 是聲明瞭變量但未對其初始化時賦予該變量的值,null 則用於表示還沒有存在的對象(在討論 typeof 運算符時,簡單地介紹過這一點)。若是函數或方法要返回的是對象,那麼找不到該對象時,返回的一般是 null。
算術運算符:
+ - * / % ++ -- 比較運算符: > >= < <= != == === !== 邏輯運算符: && || ! 賦值運算符: = += -= *= /= 字符串運算符: + 鏈接,兩邊操做數有一個或兩個是字符串就作鏈接運算
注意1: 自加自減
假如x=2,那麼x++表達式執行後的值爲3,x--表達式執行後的值爲1;i++至關於i=i+1,i--至關於i=i-1;
遞增和遞減運算符能夠放在變量前也能夠放在變量後:--i
var i=10; console.log(i++); console.log(i); console.log(++i); console.log(i); console.log(i--); console.log(--i);
注意2: 單元運算符
1
2
3
|
- 除了能夠表示減號還能夠表示負號 例如:x=-y
+ 除了能夠表示加法運算還能夠用於字符串的鏈接 例如:
"abc"
+
"def"
=
"abcdef"
|
js不一樣於python,是一門弱類型語言
注意3: NaN
var d="yuan"; d=+d; alert(d);//NaN:屬於Number類型的一個特殊值,當遇到將字符串轉成數字無效時,就會獲得一個NaN數據 alert(typeof(d));//Number //NaN特色: var n=NaN; alert(n>3); alert(n<3); alert(n==3); alert(n==NaN); alert(n!=NaN);//NaN參與的全部的運算都是false,除了!=
1
|
> >= < <= != == === !==
|
用於控制語句時:
if (2>1){ // 3 0 false null undefined [] console.log("條件成立!") }
等號和非等號的同類運算符是全等號和非全等號。這兩個運算符所作的與等號和非等號相同,只是它們在檢查相等性前,不執行類型轉換。
console.log(2==2);
console.log(2=="2"); console.log(2==="2"); console.log(2!=="2");
注意1:
注意2:
等性運算符:執行類型轉換的規則以下:
若是一個運算數是 Boolean 值,在檢查相等性以前,把它轉換成數字值。false 轉換成 0,true 爲 1。 若是一個運算數是字符串,另外一個是數字,在檢查相等性以前,要嘗試把字符串轉換成數字。 若是一個運算數是對象,另外一個是字符串,在檢查相等性以前,要嘗試把對象轉換成字符串。 若是一個運算數是對象,另外一個是數字,在檢查相等性以前,要嘗試把對象轉換成數字。 在比較時,該運算符還遵照下列規則: 值 null 和 undefined 相等。 在檢查相等性時,不能把 null 和 undefined 轉換成其餘值。 若是某個運算數是 NaN,等號將返回 false,非等號將返回 true。 若是兩個運算數都是對象,那麼比較的是它們的引用值。若是兩個運算數指向同一對象,那麼等號返回 true,不然兩個運算數不等。
if (2>1 && [1,2]){ console.log("條件與") } // 思考返回內容? console.log(1 && 3); console.log(0 && 3); console.log(0 || 3); console.log(2 || 3);
<script>
console.log(「星期一」);
console.log(「星期二」);
console.log(「星期三」);
</script>
if-else結構:
if (表達式){ 語句1; ...... } else{ 語句2; ..... }
功能說明:若是表達式的值爲true則執行語句1,不然執行語句2
示例:
if-elif-else結構:
if (表達式1) { 語句1; }else if (表達式2){ 語句2; }else if (表達式3){ 語句3; } else{ 語句4; }
示例:
switch-case結構
switch基本格式
switch (表達式) { case 值1:語句1;break; case 值2:語句2;break; case 值3:語句3;break; default:語句4; }
示例:
switch(x){ case 1:y="星期一"; break; case 2:y="星期二"; break; case 3:y="星期三"; break; case 4:y="星期四"; break; case 5:y="星期五"; break; case 6:y="星期六"; break; case 7:y="星期日"; break; default: y="未定義"; }
switch比else if結構更加簡潔清晰,使程序可讀性更強,效率更高。
循環語句流程圖
for循環:
語法規則:
for(初始表達式;條件表達式;自增或自減) { 執行語句 …… }
功能說明:實現條件循環,當條件成立時,執行語句1,不然跳出循環體
for循環的另外一種形式:
for( 變量 in 數組或對象) { 執行語句 …… }
while循環:
語法規則:
while (條件){ 語句1; ... }
功能說明:運行功能和for相似,當條件成立循環執行語句花括號{}內的語句,不然跳出循環;一樣支持continue與break語句。
示例:
try { //這段代碼從上往下運行,其中任何一個語句拋出異常該代碼塊就結束運行 } catch (e) { // 若是try代碼塊中拋出了異常,catch代碼塊中的代碼就會被執行。 //e是一個局部變量,用來指向Error對象或者其餘拋出的對象 } finally { //不管try中代碼是否有異常拋出(甚至是try代碼塊中有return語句),finally代碼塊中始終會被執行。 }
注:主動拋出異常 throw Error('xxxx')
簡介:
在JavaScript中除了null和undefined之外其餘的數據類型都被定義成了對象,也能夠用建立對象的方法定義變量,String、Math、Array、Date、RegExp都是JavaScript中重要的內置對象,在JavaScript程序大多數功能都是基於對象實現的。
<script language="javascript">
var aa=Number.MAX_VALUE; //利用數字對象獲取可表示最大數 var bb=new String("hello JavaScript"); //建立字符串對象 var cc=new Date(); //建立日期對象 var dd=new Array("星期一","星期二","星期三","星期四"); //數組對象 </script>
字符串建立(兩種方式)
① 變量 = 「字符串」
② 字串對象名稱 = new String (字符串)
1
2
|
var
str1=
"hello world"
;
var
str1=
new
String(
"hello word"
);
|
x.length ----獲取字符串的長度
x.toLowerCase() ----轉爲小寫
x.toUpperCase() ----轉爲大寫
x.trim() ----去除字符串兩邊空格
----字符串查詢方法
x.charAt(index) ----str1.charAt(index);----獲取指定位置字符,其中index爲要獲取的字符索引
x.indexOf(findstr,index)----查詢字符串位置
x.lastIndexOf(findstr)
x.match(regexp) ----match返回匹配字符串的數組,若是沒有匹配則返回null
x.search(regexp) ----search返回匹配字符串的首字符位置索引
示例:
var str1="welcome to the world of JS!"; var str2=str1.match("world"); var str3=str1.search("world"); alert(str2[0]); // 結果爲"world" alert(str3); // 結果爲15 ----子字符串處理方法 x.substr(start, length) ----start表示開始位置,length表示截取長度 x.substring(start, end) ----end是結束位置 x.slice(start, end) ----切片操做字符串 示例: var str1="abcdefgh"; var str2=str1.slice(2,4); var str3=str1.slice(4); var str4=str1.slice(2,-1); var str5=str1.slice(-3,-1); alert(str2); //結果爲"cd" alert(str3); //結果爲"efgh" alert(str4); //結果爲"cdefg" alert(str5); //結果爲"fg" x.replace(findstr,tostr) ---- 字符串替換 x.split(); ----分割字符串 var str1="一,二,三,四,五,六,日"; var strArray=str1.split(","); alert(strArray[1]);//結果爲"二" x.concat(addstr) ---- 拼接字符串
建立數組的三種方式:
建立方式1:
var arrname = [元素0,元素1,….]; // var arr=[1,2,3]; 建立方式2: var arrname = new Array(元素0,元素1,….); // var test=new Array(100,"a",true); 建立方式3: var arrname = new Array(長度); // 初始化數組對象: var cnweek=new Array(7); cnweek[0]="星期日"; cnweek[1]="星期一"; ... cnweek[6]="星期六";
建立二維數組:
join方法:
concat方法:
數組排序-reverse sort:
數組切片操做:
刪除子數組:
數組的push和pop:
數組的shift和unshift:
總結js的數組特性:
//方法1:不指定參數 var nowd1=new Date(); alert(nowd1.toLocaleString( )); //方法2:參數爲日期字符串 var nowd2=new Date("2004/3/20 11:12"); alert(nowd2.toLocaleString( )); var nowd3=new Date("04/03/20 11:12"); alert(nowd3.toLocaleString( )); //方法3:參數爲毫秒數 var nowd3=new Date(5000); alert(nowd3.toLocaleString( )); alert(nowd3.toUTCString()); //方法4:參數爲年月日小時分鐘秒毫秒 var nowd4=new Date(2004,2,20,11,12,0,300); alert(nowd4.toLocaleString( ));//毫秒並不直接顯示
獲取日期和時間
getDate() 獲取日
getDay () 獲取星期
getMonth () 獲取月(0-11) getFullYear () 獲取完全年份 getYear () 獲取年 getHours () 獲取小時 getMinutes () 獲取分鐘 getSeconds () 獲取秒 getMilliseconds () 獲取毫秒 getTime () 返回累計毫秒數(從1970/1/1午夜)
實例練習:
//該對象中的屬性方法 和數學有關.
abs(x) 返回數的絕對值。 exp(x) 返回 e 的指數。 floor(x)對數進行下舍入。 log(x) 返回數的天然對數(底爲e)。 max(x,y) 返回 x 和 y 中的最高值。 min(x,y) 返回 x 和 y 中的最低值。 pow(x,y) 返回 x 的 y 次冪。 random() 返回 0 ~ 1 之間的隨機數。 round(x) 把數四捨五入爲最接近的整數。 sin(x) 返回數的正弦。 sqrt(x) 返回數的平方根。 tan(x) 返回角的正切。 //方法練習: //alert(Math.random()); // 得到隨機數 0~1 不包括1. //alert(Math.round(1.5)); // 四捨五入 //練習:獲取1-100的隨機整數,包括1和100 //var num=Math.random(); //num=num*10; //num=Math.round(num); //alert(num) //============max min========================= /* alert(Math.max(1,2));// 2 alert(Math.min(1,2));// 1 */ //-------------pow-------------------------------- alert(Math.pow(2,4));// pow 計算參數1 的參數2 次方.
1
2
3
|
function
函數名 (參數){
<br> 函數體;
return
返回值;
}
|
功能說明:
可使用變量、常量或表達式做爲函數調用的參數
函數由關鍵字function定義
函數名的定義規則與標識符一致,大小寫是敏感的
返回值必須使用return
Function 類能夠表示開發者定義的任何函數。
用 Function 類直接建立函數的語法以下:
1
|
var
函數名 =
new
Function(
"參數1"
,
"參數n"
,
"function_body"
);
|
雖然因爲字符串的關係,第二種形式寫起來有些困難,但有助於理解函數只不過是一種引用類型,它們的行爲與用 Function 類明確建立的函數行爲是相同的。
示例:
注意:js的函數加載執行與python不一樣,它是總體加載完纔會執行,因此執行函數放在函數聲明上面或下面均可以:
如前所述,函數屬於引用類型,因此它們也有屬性和方法。
好比,ECMAScript 定義的屬性 length 聲明瞭函數指望的參數個數。
1
|
alert(func1.length)
|
window對象
全部瀏覽器都支持 window 對象。
概念上講.一個html文檔對應一個window對象.
功能上講: 控制瀏覽器窗口的.
使用上講: window對象不須要建立對象,直接使用便可.
alert() 顯示帶有一段消息和一個確認按鈕的警告框。
confirm() 顯示帶有一段消息以及確認按鈕和取消按鈕的對話框。
prompt() 顯示可提示用戶輸入的對話框。
open() 打開一個新的瀏覽器窗口或查找一個已命名的窗口。
close() 關閉瀏覽器窗口。
setInterval() 按照指定的週期(以毫秒計)來調用函數或計算表達式。
clearInterval() 取消由 setInterval() 設置的 timeout。
setTimeout() 在指定的毫秒數後調用函數或計算表達式。
clearTimeout() 取消由 setTimeout() 方法設置的 timeout。
scrollTo() 把內容滾動到指定的座標。
一、alert confirm prompt以及open函數
示例:
二、setInterval,clearInterval
setInterval() 方法會不停地調用函數,直到 clearInterval() 被調用或窗口被關閉。由 setInterval() 返回的 ID 值可用做 clearInterval() 方法的參數。
1
2
|
語法:<br> setInterval(code,millisec)
其中,code爲要調用的函數或要執行的代碼串。millisec週期性執行或調用 code 之間的時間間隔,以毫秒計。
|
示例:
畫dom樹是爲了展現文檔中各個對象之間的關係,用於對象的導航。
HTML 文檔中的每一個成分都是一個節點。
DOM 是這樣規定的:
整個文檔是一個文檔節點
每一個 HTML 標籤是一個元素節點
包含在 HTML 元素中的文本是文本節點
每個 HTML 屬性是一個屬性節點
其中,document與element節點是重點。
節點樹中的節點彼此擁有層級關係。
父(parent),子(child)和同胞(sibling)等術語用於描述這些關係。父節點擁有子節點。同級的子節點被稱爲同胞(兄弟或姐妹)。
下面的圖片展現了節點樹的一部分,以及節點之間的關係:
訪問 HTML 元素(節點),訪問 HTML 元素等同於訪問節點,咱們可以以不一樣的方式來訪問 HTML 元素。
直接查找節點
1
2
3
4
|
document.getElementById(「idname」)
document.getElementsByTagName(「tagname」)
document.getElementsByName(「name」)
document.getElementsByClassName(「name」)
|
注意:設計到尋找元素,注意<script>標籤的位置!
導航節點屬性
'''
parentElement // 父節點標籤元素
children // 全部子標籤
firstElementChild // 第一個子標籤元素
lastElementChild // 最後一個子標籤元素
nextElementtSibling // 下一個兄弟標籤元素
previousElementSibling // 上一個兄弟標籤元素 '''
注意,js中沒有辦法找到全部的兄弟標籤!
建立節點:
1
|
createElement(標籤名) :建立一個指定名稱的元素。
|
例:var tag=document.createElement(「input")
tag.setAttribute('type','text');
添加節點:
1
2
3
4
5
|
追加一個子節點(做爲最後的子節點)
somenode.appendChild(newnode)
把增長的節點放到某個節點的前邊
somenode.insertBefore(newnode,某個節點);
|
刪除節點:
1
|
removeChild():得到要刪除的元素,經過父元素調用刪除
|
替換節點:
1
|
somenode.replaceChild(newnode, 某個節點);
|
節點屬性操做:
一、獲取文本節點的值:innerText innerHTML
二、attribute操做
elementNode.setAttribute(name,value)
elementNode.getAttribute(屬性名) <-------------->elementNode.屬性名(DHTML) elementNode.removeAttribute(「屬性名」);
三、value獲取當前選中的value值
1.input
2.select (selectedIndex)
3.textarea
四、innerHTML 給節點添加html代碼:
該方法不是w3c的標準,可是主流瀏覽器支持
tag.innerHTML = 「<p>要顯示內容</p>」;
五、關於class的操做:
1
2
3
|
elementNode.className
elementNode.classList.add
elementNode.classList.remove
|
六、改變css樣式:
1
2
3
|
<p
id
=
"p2"
>Hello world!<
/
p>
document.getElementById(
"p2"
).style.color
=
"blue"
;
.style.fontSize
=
48px
|
onclick 當用戶點擊某個對象時調用的事件句柄。
ondblclick 當用戶雙擊某個對象時調用的事件句柄。
onfocus 元素得到焦點。 練習:輸入框
onblur 元素失去焦點。 應用場景:用於表單驗證,用戶離開某個輸入框時,表明已經輸入完了,咱們能夠對它進行驗證.
onchange 域的內容被改變。 應用場景:一般用於表單元素,當元素內容被改變時觸發.(三級聯動)
onkeydown 某個鍵盤按鍵被按下。 應用場景: 當用戶在最後一個輸入框按下回車按鍵時,表單提交.
onkeypress 某個鍵盤按鍵被按下並鬆開。
onkeyup 某個鍵盤按鍵被鬆開。
onload 一張頁面或一幅圖像完成加載。
onmousedown 鼠標按鈕被按下。
onmousemove 鼠標被移動。
onmouseout 鼠標從某元素移開。
onmouseover 鼠標移到某元素之上。
onmouseleave 鼠標從元素離開
onselect 文本被選中。
onsubmit 確認按鈕被點擊。
方式1:
<div id="div" onclick="foo(this)">點我呀</div> <script> function foo(self){ // 形參不能是this; console.log("點你大爺!"); console.log(self); } </script>
方式2:
<p id="abc">試一試!</p> <script> var ele=document.getElementById("abc"); ele.onclick=function(){ console.log("ok"); console.log(this); // this直接用 }; </script>
一、onload:
onload 屬性開發中 只給 body元素加.這個屬性的觸發 標誌着 頁面內容被加載完成.應用場景: 當有些事情咱們但願頁面加載完馬上執行,那麼可使用該事件屬性.
二、onsubmit:
當表單在提交時觸發. 該屬性也只能給form元素使用.應用場景: 在表單提交前驗證用戶輸入是否正確.若是驗證失敗.在該方法中咱們應該阻止表單的提交.
三、事件傳播:
四、onselect:
五、onchange:
六、onkeydown:
Event 對象:Event 對象表明事件的狀態,好比事件在其中發生的元素、鍵盤按鍵的狀態、鼠標的位置、鼠標按鈕的狀態。
事件一般與函數結合使用,函數不會在事件發生前被執行!event對象在事件發生時系統已經建立好了,而且會在事件函數被調用時傳給事件函數.咱們得到僅僅須要接收一下便可.好比onkeydown,咱們想知道哪一個鍵被按下了,須要問下event對象的屬性,這裏就時KeyCode.
七、onmouseout與onmouseleave事件的區別:
做用域是JavaScript最重要的概念之一,想要學好JavaScript就須要理解JavaScript做用域和做用域鏈的工做原理。
任何程序設計語言都有做用域的概念,簡單的說,做用域就是變量與函數的可訪問範圍,即做用域控制着變量與函數的可見性和生命週期。在JavaScript中,變量的做用域有全局做用域和局部做用域兩種。
做用域
在代碼中任何地方都能訪問到的對象擁有全局做用域,通常來講一下幾種情形擁有全局做用域:
(1)最外層函數和在最外層函數外面定義的變量擁有全局做用域
var name="yuan"; function foo(){ var age=23; function inner(){ console.log(age); } inner(); } console.log(name); // yuan //console.log(age); // Uncaught ReferenceError: age is not defined foo(); // 23 inner(); // Uncaught ReferenceError: inner is not defined
(2)全部末定義直接賦值的變量自動聲明爲擁有全局做用域,例如:
var name="yuan"; function foo(){ age=23; var sex="male" } foo(); console.log(age); // 23 console.log(sex); // sex is not defined
變量blog擁有全局做用域,而sex在函數外部沒法訪問到。
(3)全部window對象的屬性擁有全局做用域
通常狀況下,window對象的內置屬性都都擁有全局做用域,例如window.alert()、window.location、window.top等等。
和全局做用域相反,局部做用域通常只在固定的代碼片斷內可訪問到,最多見的例如函數內部,全部在一些地方也會看到有人把這種做用域成爲函數做用域.
如示例1中的age與inner都只有局部做用域。(js中if、for沒有本身的做用域)
在JavaScript中,函數也是對象,實際上,JavaScript裏一切都是對象。函數對象和其它對象同樣,擁有能夠經過代碼訪問的屬性和一系列僅供JavaScript引擎訪問的內部屬性。其中一個內部屬性是[[Scope]],由ECMA-262標準第三版定義,該內部屬性包含了函數被建立的做用域中對象的集合,這個集合被稱爲函數的做用域鏈,它決定了哪些數據能被函數訪問。
please have a try:
//-----**********************例1********************************* var s=12; function f(){ console.log(s); var s=12; // if s=12 console.log(s) } f(); //-----**********************例2********************************* var s=10; function foo(){ console.log(s); var s=5; console.log(s); function s(){console.log("ok")}// 函數的定於或聲明是在詞法分析時完成的,執行時已再也不有任何操做 console.log(s); } foo(); //-----***********************例3******************************** function bar(age) { console.log(age); var age = 99;
var sex= 'male'; console.log(age); function age() {
alert(123) }; console.log(age);
return 100; } result=bar(5); //-----********************************************************
我相信你們必定會有想不到的結果,接下來咱們就以最複雜的例3來分析整個過程。
當一個函數建立後,它的做用域鏈會被建立此函數的做用域中可訪問的數據對象填充。在函數bar建立時,它的做用域鏈中會填入一個全局對象,該全局對象包含了全部全局變量,以下圖所示:
解析到函數調用時,即bar(5),會生成一個active object的對象,該對象包含了函數的全部局部變量、命名參數、參數集合以及this,而後此對象會被推入做用域鏈的前端,當運行期上下文被銷燬,活動對象也隨之銷燬。新的做用域鏈以下圖所示:
過程解析:
function bar(age) { console.log(age); var age = 99; var sex="male"; console.log(age); function age(){ alert(123); } ; console.log(age); return 100; } result=bar(5); 一 詞法分析過程(涉及參數,局部變量聲明,函數聲明表達式): 1-1 、分析參數,有一個參數,造成一個 AO.age=undefine; 1-2 、接收參數 AO.age=5; 1-3 、分析變量聲明,有一個 var age, 發現 AO 上面有一個 AO.age ,則不作任何處理 1-4 、分析變量聲明,有一個 var sex,造成一個 AO.sex=undefine; 1-5 、分析函數聲明,有一個 function age(){} 聲明, 則把原有的 age 覆蓋成 AO.age=function(){}; 二 執行過程: 2-1 、執行第一個 console.log(age) 時,當前的 AO.age 是一個函數,因此輸出的一個函數 2-2 、這句 var age=99; 是對不 AO.age 的屬性賦值, AO.age=99 ,因此在第二個輸出的age是 99; 2-3 、同理第三個輸出的是 99, 由於中間沒有改變 age 值的語句了。 注意:執行階段: function age(){ alert(123) } ; 不進行任何操做,將執行語句複製給age這部操做是在詞法分析時,即運行前完成的。