js函數的一些難點

今天又把javascript函數部分複習了一下,把一些難點概括下,爲了讓書越看越薄,仍是決定記下來。javascript

1. 建立函數的2種方式:函數聲明和函數表達式:java

兩者的區別:函數聲明提高。函數聲明後面不能跟圓括號,但函數表達式後面能夠跟圓括號。要將函數聲明轉化爲函數表達式,只需在給函數聲明加一對圓括號便可。(function(){})();
函數聲明:重要特徵:函數聲明提高,在執行代碼前先讀取函數聲明,因此能夠把函數聲明放在調用它的語句後面。面試

sayHi();
function sayHi(){
     alert('hi');
}   //不會報錯

函數表達式在使用前必須先賦值。不然會報錯。數組

sayHi();
Var sayHi=function{
     alert('hi');
}   //會報錯

2.遞歸:arguments.callee是一個指向正在執行的函數的指針。閉包

function factorial(num){
     if(num<=1){
          return 1;
     }else{
          return num * arguments.callee(num-1);
     }
}

可是在嚴格模式下,不能經過腳本訪問arguments.callee。可經過下面的方法。app

var factorial=(function f(num){
     if(num<=1){
          return 1;
     }else{
          return num * f(num-1);
     }
});

3.this對象:函數

this對象是在運行時基於函數的執行環境綁定的:在全局函數中this等於window,而在函數被看成某個對象的方法調用時,this等於那個對象。不過,匿名函數的執行環境具備全局性,所以其this對象一般指向window(固然,在經過call()或apply()改變函數執行環境的狀況下,this就會指向其餘對象)。this

var name="the window";
var obj={
     name:"My object",
     getNameFun:function(){
          return function(){
               return this.name;
          }
     }
}
alert(obj.getNameFun()());  //the window

4.屢次聲明同一個變量:指針

function outputNumber(){
     for(var i=0;i<10;i++){
          console.log(i);  //1 2 3 4 5 6 7 8 9
     }
     var i;
     console.log(i);  //10
}

javascript歷來不會告訴你是否屢次聲明瞭同一個變量:遇到上述狀況,它只會對後續聲明視而不見(不過,它會執行後續聲明中的變量初始化)。匿名函數能夠用來模仿塊級做用域並避免這個問題。code

5.閉包與變量:
因爲做用域鏈的機制,閉包只能取得包含函數中任何變量的最後一個值。是由於閉包所保存的是整個變量對象,而不是某個特殊的變量。

function createFunction(){
     var result=new Array();
     for(var i=0;i<10;i++){
          result[i]=function(){
               return i;
          }
     }
     alert(result[2]()); //10
     return result;
}

result是一個函數數組,此時每一個函數都引用着保存變量i的同一個變量對象,因此在每一個函數內部i的值都是10. 可是能夠經過讓函數當即執行,來符合咱們的預期。

function createFunction(){
     var result=new Array();
     for(var i=0;i<10;i++){
          result[i]=function(num){
               return num;
          }(i)
     }
     alert(result);//0,1,2,3,4,5,6,7,8,9
     return result;
}

因爲函數參數是按值傳遞的,因此會將變量i的當前值複製給參數num,這樣,result數組中的每一個函數都有本身num變量的一個副本,所以就能夠返回各自不一樣的數值了。

6.返回一個函數:

function createCompareFunction(pro){
     return function(obj1,obj2){
          var va1=obj1[pro];
          var va2=obj2[pro];
          if(va1<va2){
               return -1;
          }else if(va1>va2){
               return 1;
          }else{
               return 0;
          }
     };
     }
     var compare=createCompareFunction('name');//建立函數
     alert(compare({name:'wsz'},{name:'hh'}));//調用函數

7.一道面試題:

var add=function(x){
          var sum=1;
          var tmp=function(x){
               sum=sum+x;
               return tmp;
          }

          tmp.toString=function(){
               return sum;
          }
          return tmp;
     }
alert(add(1)(2)(3));
相關文章
相關標籤/搜索