掰玉米基地

前端面试题

第一题 js的this call apply bind

js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
var a = {
a: 'haha',
getA: function () {
console.log(this.a);
}
};
var b = {
a: 'hello'
};
var getA = a.getA;
var getA2 = getA.bind(a);
function run (fn) {
fn();
}
//一下分别输出
a.getA();//haha
//this指向当前调用函数的对象a
getA();//a 对象
//当前的this指向全局this,一般遇到这样的函数调用,fn()=this.fn(),当前this指向全局
run(a.getA);//a 对象
//这里 fn = a.getA = a对象中getA这个函数,fn()this指向全局。所以 a对象
getA2.call(b);// 'haha'
//call(b)幌子。getA.bind(a) 'haha'

第二题 原型

js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
function clone(obj) {
//实现
}
var a = {name:'a'};
var b = clone(a);
//完善实现中部分,让一下代码成立
console.log(b.name)//'a'
a.name = 'a1';
console.log(b.name)//'a1'
b.name = 'b';
console.log(b.name)//'b'
console.log(a.name)//'a1'
a.name = 'a2';
console.log(b.name)//'b'
//当b没有值时,b的值是a的值,当b被赋值,ab的值互不影响
第一种答案
function clone(obj){
return Object.create(obj);
//Object.create()创建一个具有指定原型且可选择性地包含指定属性的对象。
}
第二种答案
function clone(obj){
function fn(){};
fn.prototype = obj
return new fn();
}
第三种答案
function clone(obj) {
var ret = {};
ret.__proto__ = obj;//__proto__并不是所有浏览器都支持
return ret;
}

第三题 异步

//现在有三个异步接口,分别是
(1)getTodyUser:获取当天用户id,callBack返回userId
(2)getTodyMovie:获取当天电影的id,callBake返回
(3)bookMovieFor:为用户预定影片,参数是userId和MoveId

现在要实现一个接口,bookTodyMovieForTodyUser,为当天的用户预定当天的电影

js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//获取当天预定客户
getTodyUser(function(userId){});
//获取当天的电影
getTodyMovie(function(movieId){});
//为用户预定影片
bookMovieFor(userId,movieId,function(isDone){
})
//根据以上接口封装这个函数
bookTodyMovieForTodyUser(function(isDone) {
//为今天的客户预定今天的影片
alert("预定成功")
});