function func(x,y = function assa() {x = 2;}) {
var x = 3;
y();
console.log(x);
}
func(5)//3
function func(x,y = function assa() {x = 2}) {
x = 3;
y();
console.log(x);//
}
func(5)//2
function fun1(x,y = function assasasa() {x = 2}) {
var x = 3;
var y = function asa() {x = 4}
y();
console.log(x);
}
fun1(5)//4
這三道題其實(shí)比較有意思虫腋,這里把函數(shù)參數(shù)默認(rèn)值引入進(jìn)來了,還是那句話稀余,js是詞法作用域悦冀,在定義的時(shí)候就已經(jīng)決定好了。
第一道題睛琳,函數(shù)內(nèi)部的var x = 3是一個(gè)局部變量盒蟆,而function assa其實(shí)定義在函數(shù)的外部并不在內(nèi)部踏烙,所以x = 2其實(shí)修改的是外面的x為2,反正不會修改到x = 3這里來历等,因此打印結(jié)果還是3宙帝。結(jié)果跟下面的代碼是一個(gè)意思。
function assa() {
x = 2;
}
function func(x,y = assa) {
var x = 3;
y();
console.log(x);
}
func(5)//3
第二道題募闲,和第一道題唯一的不同就是x = 3而不是var x = 3步脓,這里x = 3其實(shí)就是在改上面作用域的值了,func(5)傳入的是5浩螺,我們會認(rèn)為此時(shí)函數(shù)作用域內(nèi)x就是5靴患,但其實(shí)還有一點(diǎn)小的細(xì)節(jié)。
當(dāng)函數(shù)參數(shù)帶有默認(rèn)值的時(shí)候要出,所有的參數(shù)都會放在“參數(shù)作用域”當(dāng)中鸳君,可以理解為另一個(gè)神秘的作用域了,x其實(shí)也在里面患蹂,此時(shí)那個(gè)作用域里面有x = 5或颊,也有函數(shù)assa,由于函數(shù)func用了 x = 3修改了x的值传于,所以x = 5在參數(shù)作用域內(nèi)變成了3囱挑,然后assa調(diào)用的時(shí)候,又把值修改成了2沼溜,所以結(jié)果就是2了平挑。
第三道題,因?yàn)閥中的函數(shù)其實(shí)就定義在函數(shù)內(nèi)部系草,所以他是內(nèi)部的作用域通熄,修改的就是x = 3那個(gè)值,x變成了4找都,所以結(jié)果就是4唇辨。第三個(gè)例子最簡單,var x 和var y都和參數(shù)沒關(guān)系能耻,他們在函數(shù)內(nèi)部赏枚,所以管的是自己,就沒有什么難理解的內(nèi)容了嚎京。