詞法分析/作用域

1.js變量的查找

js中函數(shù)嵌套是十分普遍的
對(duì)變量是如何尋找的谬哀?------->從內(nèi)部向外部尋找
首先在函數(shù)內(nèi)尋找
找不到就在外層找
直到全局(window)區(qū)域

源碼例子

var c=5;
function t1(){
    var d=6;
    function t2(){
        var e=7;
        //var d=3; 去掉注釋觀察結(jié)果的變化
        alert(c+d+e);
    }
    t2();
}

t1();//分別得到15,18

2.聲明變量var的作用


alert(window.d);//undefine
alert(window.e);//undefine
function t(){
    d=5;
    var e=6;
}
t();

alert(window.d);//5  沒有加var就是僅僅是賦值操作故爵,尋找t域內(nèi)的函數(shù)玻粪,沒有找到隅津,繼續(xù)尋找。劲室。伦仍。。>window-->window.d=5
alert(window.e);//undefine


//var 是在函數(shù)運(yùn)行的上下文中很洋,申明一個(gè)變量 如果不加var充蓝,則是一個(gè)賦值操作,不要狹隘理解為創(chuàng)造了一個(gè)全局變量
function t1(){
    var d;
    function t2(){
        d=5;
        e=6;
    }
    t2();
}
t1();
console.log(d);//d is not defined錯(cuò)誤  
console.log(e);//6
console.log(window.d);//undefine

//注意:以window.xxx引用全局變量喉磁,尋找不到作為某個(gè)屬性不存在谓苟,返回 undefined 直接以xxx引用某變量尋找不到則是報(bào) xxx is not define 錯(cuò)誤

例題

var str1='global';
function t1(){
    console.log(str1);//返回global
    console.log(str2);//報(bào)str2 is not defined
    str2='local';//做了window.str2='local'這樣一個(gè)操作
}
t1();
//在t1尋找str1---沒有,在window上尋找str1---有  打印global
//在t1尋找str2---沒有协怒,在window上尋找str2---沒有涝焙,報(bào)str2 is not defined
//(實(shí)際上出錯(cuò)還沒有執(zhí)行到這一些)才把全局的str2的變量賦值上去
var str1='global';
function t1(){
    console.log(str1);//返回global
    console.log(str2);//返回undefined
    var str2='local';
}
t1();

js代碼自上而下執(zhí)行
但是js代碼在整體運(yùn)行分為 詞法分析期 ,運(yùn)行期
自上而下執(zhí)行之前孕暇,先有個(gè)詞法分析過程
------------------------------------------------例如---------------------------------------------------------------
第一步:先分析t1函數(shù)
分析出t1內(nèi)有str2局部變量仑撞,注意此時(shí)代碼未運(yùn)行str2未賦值,所以str2的值是undefined
第二步:執(zhí)行t1函數(shù)
console.log(str1);//返回global
console.log(str2);//返回undefined
str2='local'//此時(shí)str2的值為local

3.詞法分析

詞法分析
第一步:分析參數(shù)
第二部:分析變量聲明
第三步:分析函數(shù)聲明

一個(gè)函數(shù)能使用的全局變量妖滔,就是按照上面的三個(gè)步驟分析而來的

具體步驟:
0:函數(shù)運(yùn)行前的瞬間隧哮,生成active object(活動(dòng)對(duì)象),下面簡(jiǎn)稱為ao
1:函數(shù)聲明的參數(shù)形成ao的屬性座舍,參數(shù)的值就是屬性的值沮翔,接收實(shí)參,形成ao相應(yīng)屬性的值
2:分析變量的聲明
如果ao沒有有age屬性則添加為ao屬性曲秉,值全是undefined
如果ao上已經(jīng)有age屬性采蚀,則不做任何影響
3:分析函數(shù)申明,如function foo(){}
把函數(shù)賦給ao.foo屬性
注:如果此時(shí)foo屬性已經(jīng)存在岸浑,則被無情覆蓋
實(shí)例1

function t(age){
    alert(age);
}
t(5);//5
t();//undefined

/*
詞法分析過程
ao{age:undefined}
運(yùn)行過程:
t(5)-->ao.age=5;alert(ao.age);//5

t()--->ao.age沒有得到賦值還是undefined
*/

實(shí)例2

function t2(age){
    var age=99;
    alert(age);
}
t2(5);
/*
分析過程:
0:形成ao={}
1:分析形參ao={age:undefined}
   接收形參ao={age:5}
2:分析var age搏存,發(fā)現(xiàn)ao已經(jīng)有age屬性,不做任何影響

執(zhí)行過程:
ao.age=99;
alert(age);
*/

實(shí)例3

function t3(greet){
    var greet='hello';//試著變成var greet試一下
    alert(greet);
    function greet(){

    }
    alert(greet);
}
t3(null);//hello    hello
/*
詞法分析過程:
0:ao={}
1:分析參數(shù)ao={greet:undefined}
   接收形參ao={greet:null}
2:分析greet變量聲明矢洲,ao已經(jīng)有g(shù)reet 屬性璧眠,因此不做任何影響
3:分析greet函數(shù)聲明,ao.greet=function(){},被覆蓋為函數(shù)

執(zhí)行過程:
greet='hello';
alert(greet);//---------->hello
alert(greet);//---------->hello
*/

實(shí)例4

function a(b){
    alert(b);
    function b(){
        alert(b);
    }
    b();
}
a(1);
/*
分析:

0:ao={}
1:分析參數(shù)ao= {b:undefined}
  接收參數(shù)ao={b:1}
2:分析var 聲明读虏,此函數(shù)沒有var
3:分析函數(shù)聲明责静,ao={b:function{alert(b);}}

執(zhí)行:
alert(b);

*/

實(shí)例6

function a(b){
    alert(b);
    b=function(){
        alert(b);
    }
    b();
}
a(1);
/*
分析:
0:生成ao對(duì)象ao={}
1:分析參數(shù)ao={b:undefined}-->{b:1}
2:分析var聲明--->沒有
3:分析函數(shù)聲明,--->沒有盖桥,b=function(){}是一個(gè)賦值過程灾螃,是函數(shù)表達(dá)式返回值賦給變量b,這是一個(gè)賦值過程,要在執(zhí)行過程中生效

執(zhí)行:
alert(b);//1
b=function(){
    alert(b);
}
b();//function

*/

4.函數(shù)聲明和函數(shù)表達(dá)式

js被稱為披著c外衣的lisp語言揩徊,
lisp是一種強(qiáng)大的函數(shù)式語言
函數(shù)的地位比較高腰鬼,函數(shù)可以作為參數(shù)來傳遞嵌赠,可以復(fù)制給變量

function t1(){}//t1是函數(shù)聲明
t2=function(){}//t2是函數(shù)賦值過程,值是右側(cè)表達(dá)式的返回結(jié)果

//function(){}在js看來就是3+2一樣熄赡,是一個(gè)表達(dá)式姜挺,返回一個(gè)結(jié)果
//因此,t1 t2 在詞法分析過程有著明顯的區(qū)別彼硫,前者在詞法分析階段就發(fā)揮作用炊豪,后者在運(yùn)行階段才發(fā)揮作用


(function (window.undefined){})(window);
//這是jquery的最外層代碼
(function(window.undefined))//內(nèi)層表達(dá)式,返回值是函數(shù)拧篮,包在小括號(hào)內(nèi)词渤,當(dāng)成表達(dá)式來使用
(window)//立即調(diào)用,并傳一個(gè)window

//而內(nèi)層函數(shù)沒有起名字串绩,叫匿名函數(shù)缺虐,這種方法好處: 立即執(zhí)行不污染全局,稱為 立即執(zhí)行匿名函數(shù)表達(dá)式

//為什么傳window不傳undefined赏参?
//傳window是為了速度志笼,加快內(nèi)部查找全局變量的速度,直接把window以參數(shù)形式傳進(jìn)來把篓,這樣window就在jquery內(nèi)部的ao上

    function(){
        function(){
            function(){
                function{
                    function(){
                        document.getElementById()//這個(gè)document會(huì)將作用域?qū)訉由险遥钡阶钔鈱?                    }
                }
            }
        }
    }

//不傳undefined是為了安全腰涧,在ie低版本張韧掩,undefined竟然可以重新賦值,如undefined=3
//聲明undefined局部變量(名字是undefined而已)窖铡,同時(shí)又不傳參疗锐,值自熱是undefined,阻止了外界對(duì)undefined的污染

5.作用域鏈

JavaScript 開發(fā)進(jìn)階:理解 JavaScript 作用域和作用域鏈
Js作用域與作用域鏈詳解

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末费彼,一起剝皮案震驚了整個(gè)濱河市滑臊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌箍铲,老刑警劉巖雇卷,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異颠猴,居然都是意外死亡关划,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門翘瓮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贮折,“玉大人,你說我怎么就攤上這事资盅〉鏖” “怎么了踊赠?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長每庆。 經(jīng)常有香客問我筐带,道長,這世上最難降的妖魔是什么扣孟? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任烫堤,我火速辦了婚禮,結(jié)果婚禮上凤价,老公的妹妹穿的比我還像新娘鸽斟。我一直安慰自己,他們只是感情好利诺,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布富蓄。 她就那樣靜靜地躺著,像睡著了一般慢逾。 火紅的嫁衣襯著肌膚如雪立倍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天侣滩,我揣著相機(jī)與錄音口注,去河邊找鬼。 笑死君珠,一個(gè)胖子當(dāng)著我的面吹牛寝志,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播策添,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼材部,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了唯竹?” 一聲冷哼從身側(cè)響起乐导,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎浸颓,沒想到半個(gè)月后物臂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡猾愿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年鹦聪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蒂秘。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡泽本,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出姻僧,到底是詐尸還是另有隱情规丽,我是刑警寧澤蒲牧,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站赌莺,受9級(jí)特大地震影響冰抢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜艘狭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一挎扰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧巢音,春花似錦遵倦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至傲绣,卻和暖如春掠哥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背秃诵。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國打工续搀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人菠净。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓目代,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嗤练。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 目錄 1.靜態(tài)作用域與動(dòng)態(tài)作用域 2.變量的作用域 3.JavaScript 中變量的作用域 4.JavaScri...
    一縷殤流化隱半邊冰霜閱讀 7,094評(píng)論 37 113
  • 特別說明在讶,為便于查閱煞抬,文章轉(zhuǎn)自https://github.com/getify/You-Dont-Know-JS...
    殺破狼real閱讀 559評(píng)論 0 3
  • 刷朋友圈,看到大家都在寫年終總結(jié)构哺,想想再過幾個(gè)小時(shí)革答,就要邁入新年,于是想湊個(gè)熱鬧也來寫個(gè)總結(jié)曙强,一方面寫寫2016年...
    bobo斜閱讀 98評(píng)論 0 0
  • 刻意練習(xí)是黃金標(biāo)準(zhǔn): 在某個(gè)領(lǐng)域和行業(yè)残拐,必須有標(biāo)準(zhǔn)的訓(xùn)練方法,采用高度發(fā)展碟嘴、被人們廣泛接受的訓(xùn)練方法溪食。如果某人謹(jǐn)慎...
    盛碗清水閱讀 2,894評(píng)論 0 3
  • 愛上清靜還愛上了一個(gè)人獨(dú)處 從前喜歡喧囂喜歡出現(xiàn)在人潮 如今更欣賞遠(yuǎn)燈火闌珊的自己 愛自由喜無拘束 嘿~自然風(fēng),我...
    許笑話閱讀 280評(píng)論 0 1