面試前做幾道面試題:有幾道是以往面試都出現(xiàn)過,但是每次都掉進(jìn)坑里的題
今天請(qǐng)教大神給梳理了一遍
第一題:
大神說
記住一點(diǎn)就行了。如果在實(shí)例上找不到方法,才會(huì)去原型鏈找,原型鏈里的this全部指向?qū)嵗?br> 但如果有return就要注意了
1.return的是五種簡單數(shù)據(jù)類型:String凄诞,Number,Boolean忍级,Null帆谍,Undefined。
這種情況下轴咱,忽視r(shí)eturn值汛蝙,依然返回this對(duì)象。
2.return的是Object朴肺。
這種情況下窖剑,不再返回this對(duì)象,而是返回return語句的返回值戈稿。
function fn() {
this.a = 0;
this.b = function() {
alert(this.a)
}
}
fn.prototype = {
b: function() {
this.a = 20;
alert(this.a);
},
c: function() {
this.a = 30;
alert(this.a);
}
}
var myfn = new fn();
myfn.b();//0
myfn.c();//30
myfn.b();//30
第二題:
function fun(n,o) {
console.log(o)
return {
fun:function(m){
return fun(m,n);
}
};
}
var a = fun(0); a.fun(1); a.fun(2); a.fun(3);
var b = fun(0).fun(1).fun(2).fun(3);
var c = fun(0).fun(1); c.fun(2); c.fun(3);
第二道題西土,以 c 為例吧。
fun 的返回值是一個(gè) object鞍盗,其中有一個(gè)屬性叫 fun需了,對(duì)應(yīng)一個(gè) function跳昼。
由于只傳入一個(gè)參數(shù),所以 fun(0) 先輸出 undefined肋乍,然后返回:
{
fun: function(m) {
return fun(m, 0)
}
}
其中 fun(m, 0) 中的 fun 就是外面定義的 function fun(n, o)鹅颊。這其實(shí)是一個(gè)遞歸。
注意這時(shí)是在調(diào)用 fun(1, 0)墓造,即 n 是 1堪伍,o 是 0,因此觅闽,就會(huì)先輸出 0帝雇,然后得到 fun 函數(shù)的返回值,就是上面說的那個(gè)有一個(gè)屬性叫 fun谱煤,對(duì)應(yīng)一個(gè) function 的 object:
{
fun: function(m) {
return fun(m, 1) // 這里的 1 是 n
}
}
這就是 c 變量了摊求。它是一個(gè) object,有一個(gè) fun 屬性刘离。
這時(shí)候?qū)?c 調(diào)用 .fun(2),就是在調(diào)用 fun(2, 1)睹栖。所以輸出 1硫惕。
調(diào)用 c.fun(3),就是在調(diào)用 fun(3, 1)野来。所以還是輸出 1
第二道題我自己梳理了下
a=fun(0) | a.fun(1) | a.fun(2) | a.fun(3) |
---|---|---|---|
undefined | fun(1,0) | fun(2,0) | fun(3,0) |
0 | 0 | 0 |
b= fun(0) | .fun(1) | .fun(2) | .fun(3) |
---|---|---|---|
undefined | fun(1,0) | fun(2,1) | fun(3,2) |
0 | 1 | 2 |
c=fun(0) | .fun(1) | c.fun(2) | c.fun(3) |
---|---|---|---|
undefined | fun(1,0) | fun(2,1) | fun(3,1) |
0 | 1 | 1 |