原文連接 http://sentsin.com/jsquiz.html?from=timeline&isappinstalled=1html
一閉包
(function(){
return typeof arguments;
})();app
這裏return 返回的是一個對象,arguments是一個對象,函數
可是它有length這個屬性。該對象的屬性:測試
一、callee
對當前正在執行的函數的引用
二、length
傳遞給函數參數的個數(實際傳遞給函數參數的個數)ui
二 this
var f = function g(){
return 23;
};
console.log(typeof g());spa
undefinedprototype
+function g(){
return 23;
};htm
console.log(typeof g());
undefined
只要是函數表達式。而後是定義的g是一個有獨立空間的函數,
可是,變量負值之後,這個右側的命名空間就消失了,命名空間。
所以,就掛了。若是想保留的話,OK這樣。
var c = ""
var f = function g() {
console.log(111);
c = g;
}
c();
三
(function(x){ delete x; return x; })(1);
返回值——1
這裏要思考一下delete幹了什麼,delete能夠刪除對象內的屬性.
可是delete沒法刪除普通變量,如上面的delete x; 是沒法刪除的。
而且注意:delete x; 是有返回值的。刪除成功返回true;失敗是flase;
雖然沒法刪除局部變量,可是能夠刪除全局變量。
test = 'test';
delete window.test;
四
var y = 1, x = y = typeof x;
x ---> undefined
y ---> undefined
五
(function f(f){
return typeof f();
})(function(){ return 1; });
返回值是 number
由於 f() 函數自執行了。return 1; 而後就是number。
六
var foo = {
bar: function hg() {
console.log(this);
return this.baz;
},
baz: 1
};
(function(){
return typeof arguments[0]();
})(foo.bar);
'undefined"
這個題目其實挺酷,我很喜歡,
注意:這是定義在foo對象中,對象順序執行,所以,foo.bar == 1 (true); 並非函數。
固然若是是function中的話,function內定義的函數 》 傳入的參數 》 函數內的變量。頗有意思吧。哈哈
這裏由於是一個閉包中執行,將函數以參數的形式傳入,做用域是閉包的做用域。this指向了hg這個函數自己。
所以,在下面自執行的函數中, foo.bar() ---> 找不到 baz 這個變量。
七
var foo = {
bar: function (){
console.log(this, " ", this.baz);
return this.baz;
},
baz: 1
}
typeof (f = foo.bar)();
undefined
這個跟上面的很像,
對比一下: 直接輸出 foo.bar() ---> 1
而,選擇 f = foo.bar ---> f()---> undefined 是由於改變了做用域。
f() 的做用域是全局,並無baz這個變量。
八
var f = (
function f(){
return "1";
},
function g(){
return 2;
}
)();
typeof f;
這個題目頗有意思啊,哈哈,結果是 number 我其實第一反應是 var a = (1, 2, 3); 有點像逗號賦值運算,
OK,若是這麼理解也就容易了。可是有個問題,爲何這麼玩呢?看下面的測試。
var f = (
function f(){
console.log("1111");
return "1";
},
function g(){
console.log('22222');
return 2;
}
)();
typeof f;
22222
"number"
這樣就說的通了,選擇了第二個function,而後再自執行。
九
var x = 1;
if (function f(){}) {
x += typeof f;
}
x;
"1undefined"
這個玩法碉堡了。。。。我靠!
function f () {} == true 這個怎麼破???
function f() {} ---> 是一個對象。
就比如 if( {} ) {
console.log(111);
}
同樣也能夠打印出來。
十
var x = [typeof x, typeof y][1];
typeof typeof x;
這個例子也是很酷斃的。x, y 最開始並無什麼值,都是undefined。
首先 x = ["undefined", "undefined"] ---> x[1] ---> "undefined"字符串。
而後 typeof x ---> "string"
而, typeof typeof x ---> string.
十一
(function(foo){
return typeof foo.bar;
})({ foo: { bar: 1 } });
這段代碼很賊。考的是細心,注意傳入的參數,{foo: {bar:1}}
這裏傳入的是一個對象,對象裏面包着對象。
所以,foo.bar 。並無這個屬性,有的只是 foo.foo。
這個須要細心一點,foo.foo.bar 纔有意義。
所以是 undefined
十二
(function f(){
function f(){ return 1; }
return f();
function f(){ return 2; }
})();
這個問題其實前面提到過,在函數中定義函數,
OK,都會跑一遍的,全部最後一個f會覆蓋第一個,
所以,返回 2。
十三
function f(){ return f; }
new f() instanceof f;
false
這個亞童也分享了,很酷,我以爲這個例子比較爽,頗有意思。
這裏須要關注的問題是new,new 幹了什麼事情,這裏就不寫了,字有點多,
重點是 function Object() {
return AA;
}
主要關注的是,這裏返回的AA是什麼,若是是AA對象,
那麼,返回值就是AA,它會脫落Object這個對象的實例,就是 返回值的 __proto__的指向問題,
那麼咱們已經有兩種方式改變這個了,一種是在返回值設定一個一對象,另外一種直接改變 __proto__的指向來改變。
那這就很明顯了,確定是false了,由於new f()的 __proto__指向並無指向 f.prototype.
這個技能很爽!!!哈哈。
十四
with (function(x, undefined){}) length;
OK 這個亞童分享了,
with做用,以前並無理解的很透徹,這回感受很酷炫,
var obj = {
a : 1,
b : 2,
c : 3
}
with (obj) {
console.log(a);
console.log(b);
console.log(c);
}
上面的length是函數參數的length,
function 自己也是有length這個屬性的。
用arguments.length 獲取實際傳入的參數。
function.length 能夠獲取函數聲明的參數個數。