題目來(lái)源:https://www.cnblogs.com/simonbaker/p/4237970.html
九道題目還是很有紀(jì)念價(jià)值的:
第一道:
a()
var a = c = function() {
console.log(2)
}
a()
function a() {
console.log(1)
}
a();
(function(b) {
b(), c()
var b = c = function a() {
console.log(3)
}
b()
})(a)
c()
答案:1 2 2 2 2 3 3
解析:這個(gè)可以放在最后解析
var A = function() {}
A.prototype.n = 1;
var b = new A()
A.prototype = {
n: 2,
m: 3
}
var c = new A()
console.log(b.n, b.m, c.n, c.m)
答案:1 undefined 2 3
解析:在b被實(shí)例化的時(shí)候只是有A的變量表達(dá)式譬圣,給了A的原型對(duì)象一個(gè)n的屬性勇凭,此時(shí)m屬性為定義,因此b.m=undefined;類似原理,在c被實(shí)例化的時(shí)候脑蠕,A的原型對(duì)象被重新賦值,因此c.n=2,c.m=3
(function f() {
function f() {
return 1;
}
return f();
function f() {
return 2;
}
})();
答案:2
解析:同名函數(shù)聲明舒萎,后面的函數(shù)聲明替換前面的函數(shù)聲明藐鹤,因此返回的f()是第二個(gè)聲明的函數(shù)
if (!a) {
var a = 1;
}
console.log(a)
答案: 1
解析:這個(gè)是不是很簡(jiǎn)單,因?yàn)閖s沒有塊級(jí)作用域呀登疗。
拓展一下:
if (!(a in window)) {
var a = 1;
}
console.log(a)
變量提升排截,因此首先a在window中滿足條件,因此賦值語(yǔ)句無(wú)法執(zhí)行辐益,因此最后打印出來(lái)是undefined断傲。
如果此時(shí)var變?yōu)閘et,那么無(wú)法打印a荷腊,因?yàn)閘et是可以形成塊級(jí)作用域呀艳悔,無(wú)法提升變量!E觥猜年!
5
function a() {}
var a;
console.log(typeof a)
答案:function
解析:只要記住一條就可以了,函數(shù)聲明 替換 變量聲明(記住不要把變量聲明理解為變量賦值哦)
6
(function(b) {
console.log(b)
var b = c = 2
console.log(b)
})(1)
答案:1 2
解析:
(function (b) {
var b = 1//所謂的傳入?yún)?shù)的過(guò)程就是聲明加賦值
console.log(b)
var b = c = 2
console.log(b)
})(1)
7
(function(b) {
console.log(b)
var b = c = 2
console.log(b)
function b() {}
console.log(b)
})(1)
答案:f b(){} 2 2
解析:換一種寫法就很清楚了
(function(b) {
var b=1//參數(shù)定義擱在最前面
function b() {}//函數(shù)聲明提升疾忍,不好意思乔外,把上面的覆蓋了
console.log(b)//打印的就是函數(shù)嘍
var b = c = 2
console.log(b)//2
console.log(b)//2
})(1)
var a = 10;
function fn() {
console.log(1)
var a = 100;
console.log(a)
}
fn();
答案:1 100
解析:這個(gè)要是不知道,那就去看書吧
9
var a = 1
function c(a, b) {
console.log(a)
a = 2
console.log(a)
}
c()
答案:undefined 2
解析:
var a = 1
function c(a, b) {
console.log(a)
a = 2
console.log(a)
}
c()
console.log(a)
打印一下a就會(huì)發(fā)現(xiàn)是1呀一罩,所以參數(shù)如果和外部的變量同名杨幼,不要去糾結(jié),把參數(shù)當(dāng)做另一個(gè)字母表示就可以了
在講解題目的時(shí)候聂渊,先貼兩份代碼差购,
當(dāng)傳入?yún)?shù)為函數(shù)聲明的時(shí)候:
function f(a) {
console.log(a); // ? a() { console.log('outer'); }
var a = 2;
console.log(a); // 2
}
f(a);
function a() {
console.log('outer');
}
換個(gè)清楚的:
function f(a) {
function a() {
console.log('outer');
}
console.log(a); // ? a() { console.log('outer'); }
var a = 2;
console.log(a); // 2
}
f(a);
function a() {
console.log('outer');
}
再來(lái)一個(gè)
function f(a) {
console.log(a); // ? a() { }
var a = 2;
function a() {}
console.log(a); // 2
}
f(a);
function a() {
console.log('outer');
}
擦擦眼睛:
function f(a) {
function a() {
console.log('outer');
}
function a() {}
console.log(a); // ? a() { }
var a = 2;
console.log(a); // 2
}
f(a);
function a() {
console.log('outer');
}
第二類情況:傳入函數(shù)賦值的變量
function f(a) {
console.log(a); // function a() {}
var a = 2;
function a() {}
console.log(a); // 2
}
f(a);
var a = function b() {
console.log('outer');
}
擦擦眼睛:
function f(a) {
var a = function b() {
console.log('outer');
}
function a() {}
console.log(a); // function a() {}
var a = 2;
console.log(a); // 2
}
f(a);
var a = function b() {
console.log('outer');
}
ok:核浴欲逃!再回頭看第一題是不是很好理解了
解析:
function a() {
console.log(1)
} //函數(shù)聲明提升
a() //第一個(gè)a()打印出來(lái)就是1
var a = c = function () {
console.log(2)
} //給a,c重新賦值
a() //第二個(gè)a執(zhí)行因此為2
a(); //第三個(gè)a執(zhí)行因此為2
(function (b) { //b其實(shí)就是a啊
b(), c() //a沒有改變饼暑,當(dāng)然打印2呀稳析,c又不是參數(shù)洗做,c根據(jù)作用域鏈,發(fā)現(xiàn)了父級(jí)的作用域鏈彰居,打印的當(dāng)然也是2
var b = c = function a() {
console.log(3)
} //記得賦值是從右往左賦值诚纸,而且c被重新賦值了,而且c還在window中
b()
})(a)
c()
a()//2
完結(jié)3露琛F枧恰!
參考:https://www.cnblogs.com/simonbaker/p/4237970.html
https://www.cnblogs.com/aredleave/p/7596233.html
https://blog.csdn.net/weixin_34273046/article/details/87015464