JS函數調用的多種辦法

js的函數調用會免費奉送兩個而外的參數就是 this 和 arguments 。arguments是參數組,他並不是一個真實的數組,但是可以使用.length方法獲得長度。

書上有說4中調用方式:

  • 方法調用模式
  • 函數調用模式
  • 構造器調用模式
  • apply調用模式

下面我們來看看一些實例更好理解。

1:方法調用模式。

請注意this此時指向myobject。

/*方法調用模式*/
    var myobject={
            value:0,
            inc:function(){
                    alert(this.value)
                }
        }
    myobject.inc()

 

2:函數調用模式

請注意this此時指向window

/*函數調用模式*/
    
    var add=function(a,b){
        alert(this)//this被綁頂到window
            return a+b;
        }
    var sum=add(3,4);
    alert(sum)

 

3:構造器調用模式

javascript語言精粹一書建議摒棄這中方式。因爲有更好的方式。這裏先不介紹。下次發表博文的時候貼出來。

會在這裏加一個連接。

/*構造器調用模式  摒棄*/
    
    var quo=function(string){
            this.status=string;
        }
    quo.prototype.get_status=function(){
            return this.status;
        }
    var qq=new quo("aaa");
    alert(qq.get_status());

 

4:apply調用模式

==我們可以來看一個更有用的apply實例。看最下面的代碼。

 

/*apply*/
    //注意使用了上面的sum函數
    //與myobject
    //這中調用方式的優點在於可以指向this指向的對象。
    //apply的第一個參數就是this指針要指向的對象
    var arr=[10,20];
    var sum=add.apply(myobject,arr);
    alert(sum);

 

看這個apply真正應用。bind這是一個綁定時間的函數

var bind=function(object,type,fn){
            if(object.attachEvent){//IE瀏覽器
                    object.attachEvent("on"+type,(function(){
                                                           return function(event){
                                                               window.event.cancelBubble=true;//停止時間冒泡
                                                               object.attachEvent=[fn.apply(object)];//----這裏我要講的是這裏
                                                               //在IE裏用attachEvent添加一個時間綁定以後。
                                                               //this的指向不是到object對象本身所以。我們綁定的function裏的this.id是無法正常工作的。
                                                               //但是如果我們用fn.apply(object)
                                                               //這裏可以看出我們是把apply的第一個對象也就是this的指向變更給了object所以this.id就變成了
                                                               //object.id 可以正常工作了。
                                                               
                                                               }
                                                           })(object),false);
                }else if(object.addEventListener){//其他瀏覽器
                        object.addEventListener(type,function(event){
                                                              event.stopPropagation();//停止時間冒泡
                                                              fn.apply(this)
                                                              });
                    }
            
        }
    bind(document.getElementById("aaa"),"click",function(){alert(this.id)}); 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章