原文链接 http://sentsin.com/jsquiz.html?from=timeline&isappinstalled=1
一
(function(){
return typeof arguments;
})();
这里return 返回的是一个对象,arguments是一个对象,
但是它有length这个属性。该对象的属性:
1、callee
对当前正在执行的函数的引用
2、length
传递给函数参数的个数(实际传递给函数参数的个数)
二
var f = function g(){
return 23;
};
console.log(typeof g());
undefined
+function g(){
return 23;
};
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 可以获取函数声明的参数个数。