Webフロントエンド筆記試験面接問題集

1958 ワード

Webフロントエンド筆記試験面接問題集
JavaScript関連
1.変数の昇格
JSコードを実行すると、実行環境が生成されます.コードが関数に書かれていない限り、グローバル実行関数では、関数のコードが関数実行環境を生成します.この2つの実行環境しかありません.実行環境を生成するには、2つのフェーズがあります.第1段階は作成段階で、JS解釈器は昇格する必要がある変数と関数を探し出して、そして彼らに早めにメモリの中で空間を開拓して、関数は全体の関数をメモリの中に保存して、変数はただ宣言してそしてundefinedに値を割り当てます;したがって、第2段階、すなわちコード実行段階では、直接事前に使用することができます.アップグレード中は、同じ関数が前の関数を上書きし、関数が変数よりも優先されます.
b(); // b;  

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

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

2.apply、call、bindの違いcallおよびapplyは、thisの指向を変更することを解決するために使用され、作用は同じであるが、伝達されるパラメータは異なる.最初のパラメータに加えて、callは1つのパラメータリストを受け入れることができ、applyは1つのパラメータ配列のみを受け入れることができる.bindと他の2つの方法の役割も一致しているが、この方法は関数を返す.
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));
    }
}