1. 程式人生 > 其它 >js高階_上下文物件面試題

js高階_上下文物件面試題

1

	console.log('global begin:'+i);
	var i=1;
	foo(1);
	function foo(i){
		if(i==4)
		return;
		
		console.log('foo() begin:'+i);
		foo(i+1);
		console.log('foo() end:'+i);
	}
	console.log('global end:'+i);	
	
	
	//i的值存在每次建立的函式上下文物件裡的,所以每個函式上下文物件裡的i的值不一樣。
	
	//依次輸出:undefindd 、1、2、3、3、2、1、1
	//整個過程產生5個上下文物件(4+1);

2

function a(){
	
}

var a;

console.log(typeof a);//結果為function,先執行變數提升再執行函式提升。

如果將a賦值為基本資料型別的值,那麼結果就是基本資料型別,因為雖然是變數提升,後面函式提升後覆蓋了a,將它賦值為了函式,但是有a有賦值,賦值是這兩個提升後執行程式碼的時候才會進行的操作,所以賦值的話,他的值就又從函式變為了值。

3

if(!(b in window)){
	var b=1;
}
console.log(b);//undefind

雖然b沒有用var 宣告,但是這個判斷是寫在全域性作用域裡的,不是單獨在方法裡,而且因為變數有變數宣告提前,而且這個b又是在全域性的判斷裡的,所以在建立全域性上下文物件的時候就會有這個b變量了,只是沒有值,而且這個判斷結果為false,也就沒有賦值。如果這個判斷沒有在全域性,而是在方法裡,拿就會報錯。

4

var c=1;
function c(c){
	console.log(c);
	var c=3;
}

c(2);

會報錯,因為c不是一個函式,首先變數提升,c的值是undefind,緊接著函式提升,c的值是一個函式,接著開始一行一行執行程式碼,開始給c賦值,c賦值為了1,所以c是變數。所以在全域性作用域,變數有賦值的話,總是在執行到它的時候賦值的,不是在全域性上下文物件建立的時候賦值的。