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

鍍金池/ 問(wèn)答/HTML/ 在函數(shù)的作用域中,又有傳參又有var 新的聲明且變量名字一樣的時(shí)候該以哪一個(gè)優(yōu)先

在函數(shù)的作用域中,又有傳參又有var 新的聲明且變量名字一樣的時(shí)候該以哪一個(gè)優(yōu)先級(jí)高?

<script>
var a=1
function fn1(a){//教程中介紹:此處傳參a就相當(dāng)于在函數(shù)中var a
var a=3+a//問(wèn)題1:此處重新var a是吧傳參處聲明的a重新清空并覆蓋掉嗎?問(wèn)題2:對(duì)于傳參處聲明的var a和此處聲明的var a有聲明區(qū)別嗎,它們兩者的關(guān)系,和js解讀的邏輯請(qǐng)?jiān)敿?xì)講解下。
alert(a)
var a=8//問(wèn)題3:此處重新var a是吧傳參處聲明的a重新清空并覆蓋掉嗎?還是前面的var a=3+a,a重新清空并覆蓋掉嗎?

           alert(a)

}
fn1(4);
alert(a)
</script>
問(wèn)題1:此處重新var a是吧傳參處聲明的a重新清空并覆蓋掉嗎?
問(wèn)題2:對(duì)于傳參處聲明的var a和此處聲明的var a有聲明區(qū)別嗎,它們兩者的關(guān)系,和js解讀的邏輯請(qǐng)?jiān)敿?xì)講解下。
問(wèn)題3:此處重新var a是吧傳參處聲明的a重新清空并覆蓋掉嗎?還是前面的var a=3+aa重新清空并覆蓋掉嗎?
問(wèn)題4:在函數(shù)的作用域中,又有傳參又有var 新的聲明且變量名字一樣的時(shí)候預(yù)解析該以哪一個(gè)優(yōu)先級(jí)高?

回答
編輯回答
雨蝶

1、樓上說(shuō)得不錯(cuò),先贊一下;
2、這是我在瀏覽器的一個(gè)實(shí)例,可以看一下;
clipboard.png
3、再上理論——函數(shù)內(nèi)的變量提升!當(dāng)js進(jìn)入到新的函數(shù)時(shí),函數(shù)內(nèi)所有變量的聲明都被提到函數(shù)最前面,但是賦值操作還在原地不動(dòng)。另外很重要的一點(diǎn)是,變量聲明是系統(tǒng)根據(jù)變量名稱(chēng)進(jìn)行內(nèi)存空間分配的,當(dāng)之前已有某一變量時(shí),你只是單純地聲明而不是賦值的話(huà),它所占內(nèi)存空間是不變的,也就是說(shuō)該變量值是不變的!再上一張圖,來(lái)自于 javascript面向?qū)ο缶幊讨改?/a> 這本書(shū),可以搜搜看電子版
圖片描述

2017年7月26日 21:34
編輯回答
玄鳥(niǎo)

首先你要明白一個(gè)知識(shí)點(diǎn)就是變量聲明提升,并且變量重復(fù)聲明并不會(huì)影響其值

var a = 1;
console.log(a);//1
var a = 2;
console.log(a);//2
var a = a+4;
console.log(a);//6

上面等價(jià)下面

var a,a,a;//聲明提升
//下面的都是賦值操作
a = 1;
console.log(a);//1
a = 2;
console.log(a);//2
a = a+4;
console.log(a);//6

從上面看 聲明過(guò)的變量 重新聲明是沒(méi)有意義的,所以就不存在聲明變量誰(shuí)覆蓋誰(shuí),因?yàn)橹灰幸粋€(gè)聲明就夠了(同一個(gè)作用域)
你的代碼就變成下面的了

var a;//聲明提前
a = 1;//全局變量
function fn1(a) {
    //重復(fù)聲明沒(méi)有意義所以直接省略(同一個(gè)作用域)
    //下面都是簡(jiǎn)單的賦值操作不用說(shuō)了
    a = 3 + a;
    console.log(a);//7
    a = 8;
    console.log(a);//8
}
fn1(4);
alert(a);//函數(shù)內(nèi)聲明的變量是局部的并不會(huì)影響全局變量 所以這里是a=1
2017年4月12日 15:29