原文连接 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 能够获取函数声明的参数个数。