Web前端笔试面试题集锦

Web前端笔试面试题集锦

JavaScript相关

1. 变量提升

    执行JS代码时,会生成执行环境,只要代码不是写在函数中的,就是在全局执行函数中,函数中的代码会产生函数执行环境,只有这两种执行环境。
    在生成执行环境时,会有两个阶段。第一个阶段是创建阶段,JS解释器会找出需要提升的变量和函数,并且给他们提前在内存中开辟空间,函数会将整个函数存入内存中,变量只声明并且赋值为undefined;所以在第二阶段,也就是代码执行阶段,我们可以直接提前使用。
    在提升过程中,相同的函数会覆盖上一个函数,并且函数优先于变量。

b(); // b;  

function b(){
	console.log('a');
}  

function b(){
	console.log('b');
}  
var b = 'c';  

2. apply、call、bind区别

    callapply都是为了解决改变this的指向,作用是相同的,只是传递的参数不同。
    除了第一个参数外,call可以接受一个参数列表,apply只接受一个参数数组。
    bind和其他两个方法作用也是一致的,只是该方法返回一个函数。

2.1. 实现一个call函数

Function.prototype.myCall = function(context){
	var context = context || window;
	//给context添加一个fn属性
	//add.call(a, b,c)==>a.add(b,c);
	//this指针指向的是调用call函数的对象,即add本身
	context.fn = this;
	var args = [...arguments].slice(1);
	
	var result = context.fn(args);
	delete context.fn;
    return result;		
}

2.2. 实现一个apply函数

Function.prototype.myCall = function(context){
	var context = context || window;
	
	context.fn = this;
	var result;
	//判断第二个参数
	if(arguments[1])
		result =  context.fn(...agguments[1]);
	else
		result =  context.fn();

	delete context.fn;
    return result;		
}

2.3. 实现一个bind函数

Function.prototype.myBind = function (context) {
	if (typeof this !== 'function') {
		throw new TypeError('Error')
	}

	var _this = this;
	var args = [...arguments].slice(1);
    // 返回一个函数
    return function F() {
    // 因为返回了一个函数,我们可以 new F(),所以需要判断
    if (this instanceof F) {
  		return new _this(...args, ...arguments);
    }

	return _this.apply(context, args.concat(...arguments));
    }
}

你可能感兴趣的:(JavaScript,HTML5)