考驗你的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 能夠獲取函數聲明的參數個數。

相關文章
相關標籤/搜索