考验你的JavaScript底细

原文链接 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 可以获取函数声明的参数个数。

 

 

posted on 2016-04-05 10:46  HGonlyWJ  阅读(337)  评论(3编辑  收藏  举报

W3C中国
阮老师的网络日志
canvas
runoob
迷渡
并发编程网
原生JS例子
前端外刊评论