在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ js作用域相關(guān)問題

js作用域相關(guān)問題

先上代碼

function a() {
    var temp = 10;
    function b() {
        console.log(temp); // 10
    }
    b();
}
a();
function a() {
    var temp = 10;
    b();
}
function b() {
    console.log(temp); // 報(bào)錯(cuò)
}
a();

模模糊糊有個(gè)作用域的概念,但是無法清楚明白的說出來,請(qǐng)大佬指點(diǎn)~

*打印出a函數(shù)的原因是將變量和函數(shù)取為同名了,現(xiàn)在已修改

回答
編輯回答
裸橙

es6之前javascript只有全局作用域和函數(shù)作用域,沒有塊級(jí)作用域。要么就是全局,要么就是函數(shù)作用域。函數(shù)可以訪問父級(jí)函數(shù)的變量,反過來則不行。函數(shù)里的變量只能在函數(shù)內(nèi)部訪問,外部則不行。第一個(gè)a函數(shù)里面有一個(gè)b函數(shù),實(shí)際上這是一個(gè)閉包,a函數(shù)外部不能訪問a函數(shù)內(nèi)部的a變量。第二個(gè),函數(shù)a和函數(shù)b都在全局作用域下,a函數(shù)不能訪問b函數(shù)內(nèi)部的變量,b函數(shù)也不能訪問a函數(shù)內(nèi)部的變量,所以才會(huì)報(bào)錯(cuò)。

2018年1月5日 17:20
編輯回答
網(wǎng)妓

globalContext={

AO:{
    a: function,
    b: function,
},
scopeChain: [globalContext.AO],
this: globalContext.this

}

aContext = {

AO:{
    a = 10
},

scopeChain: [globalContext.AO, aContext.AO],
this: globalContext.this

}

bContext = {

AO:{
},
scopeChain:[globalContext.AO, bContext.AO],
this: gloabalContext.this

}

執(zhí)行上下文棧,
b的AO中找不到變量a,會(huì)順著作用域鏈向上爬,在gobal中找到函數(shù)a,打印出來
ESstack = [globalContext, aContext, bContext]

2017年2月24日 19:52
編輯回答
兔寶寶

不會(huì)報(bào)錯(cuò),b函數(shù)中的a打印出來是a函數(shù)

2018年4月28日 10:07
編輯回答
巴扎嘿

我試了下 沒報(bào)錯(cuò)啊 打出來的是函數(shù) a。求大佬指點(diǎn)下

2017年1月17日 16:27
編輯回答
笨小蛋

第一段代碼相信沒啥問題,函數(shù)b執(zhí)行是能取到其父函數(shù)a作用域下的變量a

第二段由于函數(shù)a和函數(shù)b是同級(jí)函數(shù),變量a是在函數(shù)a的作用域下,且沒有全局作用域下的變量a的聲明,所以報(bào)錯(cuò)。

2017年10月28日 01:02
編輯回答
祈歡

第二種,怎么會(huì)是報(bào)錯(cuò)呢?不太明白題主的報(bào)錯(cuò)是什么意思,a是一個(gè)函數(shù),輸出函數(shù)不會(huì)報(bào)錯(cuò)

調(diào)用函數(shù)時(shí)函數(shù)內(nèi)調(diào)用的變量會(huì)在本函數(shù)內(nèi)或定義函數(shù)的作用域向外找

在定義函數(shù)的作用域找而非調(diào)用的作用域:

function a(){
    console.log(b);
}
let b = 10
{
    let b = 1;
    a();//10
}

當(dāng)調(diào)用b的時(shí)候,b會(huì)在本函數(shù)內(nèi)找a,沒有向外找,去定義b的作用域(全局)找a,這時(shí)a是全局函數(shù)找到了,然后輸出a

2018年7月26日 06:15
編輯回答
哚蕾咪

簡(jiǎn)單介紹作用域:作用域說白了就是一套規(guī)則,一套存儲(chǔ)變量,并可以訪問變量的規(guī)則。作用域類型可以分為:詞法作用域、函數(shù)作用域以及塊作用域。涉及到詞法作用域就不能不提閉包這個(gè)非常有用而又神秘的概念。當(dāng)某個(gè)函數(shù)可以記住并訪問所在的詞法作用域,且在當(dāng)前詞法作用域之外執(zhí)行時(shí)就產(chǎn)生了閉包。
當(dāng)然作用域不止這些東西。因?yàn)閖avascript其實(shí)最難的就三個(gè)東西:作用域、原型、異步,要徹底理解還是需要花點(diǎn)時(shí)間慢慢跑幾個(gè)demo才行的。

講完作用域,在回頭看看你的代碼:
上面的函數(shù)b打印a之所以報(bào)錯(cuò),是因?yàn)樽兞縜是在函數(shù)a中定義的,b是沒有這個(gè)變量的,所以就報(bào)錯(cuò)了。

2017年4月6日 20:09
編輯回答
汐顏

問題太基本,并且很寬泛,建議看看《JavaScript高級(jí)程序設(shè)計(jì)》或者《You Don't Know JS》的相關(guān)章節(jié),以及 sf 有很多相關(guān)文章。

2017年7月8日 21:22