| 翻到了這篇解釋Javascript quiz的文章quiz-legend,反正沒事兒,就想搬過來供大家學(xué)習(xí)、理解、背誦、批判。 問題一  (function(){ return typeof arguments;//'object'})();  arguments是一個Array-like對象,對應(yīng)的就是傳入函數(shù)的參數(shù)列表。你可以在任何函數(shù)中直接使用該變量。 由此我們推斷出,typeof arguments是object  問題二  var f = function g(){ return 23; };typeof g();//報錯  這是一個名字是g的function expression,然后又被賦值給了變量f。 問題三  (function(x){ delete x; return x;//1})(1);  delete操作符可以從對象中刪除屬性,正確用法如下: 你最好也知道,delete是不會直接釋放內(nèi)存的,她只是間接的中斷對象引用  問題四 問題五  (function f(f){ return typeof f();//'number'})(function(){ return 1; });  直接上注釋解釋:  (function f(f){ //這里的f是傳入的參數(shù)function(){ return 1; } //執(zhí)行的結(jié)果自然是1 return typeof f(); //所以根據(jù)問題一的表格我們知道,typeof 1結(jié)果是'number'})(function(){ return 1; });  問題六  var foo = { bar: function() { return this.baz; }, baz: 1};(function(){ return typeof arguments[0]();//'undefined'})(foo.bar);  這里你可能會誤以為最終結(jié)果是number。向函數(shù)中傳遞參數(shù)可以看作是一種賦值,所以arguments[0]得到是是真正的bar函數(shù)的值,而不是foo.bar這個引用,那么自然this也就不會指向foo,而是window了。  問題七  var foo = { bar: function(){ return this.baz; }, baz: 1}typeof (f = foo.bar)();//'undefined'  這和上一題是一樣的問題,(f = foo.bar)返回的就是bar的值,而不是其引用,那么this也就指的不是foo了。  問題八 var f = (function f(){ return '1'; }, function g(){ return 2; })();typeof f;//'number'  逗號操作符 對它的每個操作對象求值(從左至右),然后返回最后一個操作對象的值  所以(function f(){ return '1'; }, function g(){ return 2; })的返回值就是函數(shù)g,然后執(zhí)行她,那么結(jié)果是2;最后再typeof 2,根據(jù)問題一的表格,結(jié)果自然是number  問題九  var x = 1;if (function f(){}) { x += typeof f;}x;//'1undefined'  這個問題的關(guān)鍵點,我們在問題二中談到過,function expression中的函數(shù)名f是不能在函數(shù)體外部訪問的 問題十  var x = [typeof x, typeof y][1];typeof typeof x;//'string' 1.因為沒有聲明過變量y,所以typeof y返回'undefined'  2.將typeof y的結(jié)果賦值給x,也就是說x現(xiàn)在是'undefined' 問題十一 (function(foo){ return typeof foo.bar;//'undefined'})({ foo: { bar: 1 } });  這是個純粹的視覺詭計,上注釋  (function(foo){ //這里的foo,是{ foo: { bar: 1 } },并沒有bar屬性哦。 //bar屬性是在foo.foo下面 //所以這里結(jié)果是'undefined' return typeof foo.bar;})({ foo: { bar: 1 } });  問題十二  (function f(){ function f(){ return 1; } return f();//2 function f(){ return 2; }})();  通過function declaration聲明的函數(shù)甚至可以在聲明之前使用,這種特性我們稱之為hoisting。于是上述代碼其實是這樣被運行環(huán)境解釋的:  (function f(){ function f(){ return 1; } function f(){ return 2; } return f();})();  問題十三 function f(){ return f; }new f() instanceof f;//false  當(dāng)代碼new f()執(zhí)行時,下面事情將會發(fā)生: ps:一般情況下構(gòu)造函數(shù)不返回任何值,不過用戶如果想覆蓋這個返回值,可以自己選擇返回一個普通對象來覆蓋。當(dāng)然,返回數(shù)組也會覆蓋,因為數(shù)組也是對象。  于是,我們這里的new f()返回的仍然是函數(shù)f本身,而并非他的實例  問題十四 OK,現(xiàn)在我們來看,由于function(x, undefined){}是一個匿名函數(shù)表達(dá)式,是函數(shù),就會有l(wèi)ength屬性,指的就是函數(shù)的參數(shù)個數(shù)。所以最終結(jié)果就是2了  寫在最后 有人覺得這些題坑爹,也有人覺得開闊了眼界,見仁見智吧。但有一件事是真的,無論你?理論基礎(chǔ),也鐵定走不遠(yuǎn) - 你永遠(yuǎn)不會見到哪個熟練的技術(shù)工人突然成了火箭專家。  看文檔、讀標(biāo)準(zhǔn)、結(jié)合實踐,才是同志們的決勝之道。 以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。 | 
|  |