考验你的JavaScript底细

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

相关文章
相关标签/搜索