JS函數的四種調用模式

JS函數不一樣於其餘的語言,每一個函數都是做爲一個對象被維護和運行的。
經過函數對象的性質,能夠很方便的將一個函數賦值給一個變量或者將函數做爲參數傳遞。
函數的使用語法:
function func1(…){…}
var func2=function(…){…};
var func3=function func4(…){…};
var func5=new Function();
JS函數的四種調用模式:方法調用模式,函數調用模式,構造器調用模式,apply調用模式
這些模式在如何初始化關鍵參數this上存在差別。
1, 方法調用模式
當一個函數被保存爲對象的一個屬性時,咱們稱之它爲該對象的一個方法,那麼this被綁定到該對象上
var myObject={
    name : "myObject" ,
    value : 0 ,
    increment : function(num){
        this.value += typeof(num) === 'number' ? num : 0;
        return this;
    } ,
    toString : function(){
        return '[Object:' + this.name + ' {value:' + this.value + '}]';
    }
};
alert(myObject.increment(10).increment(20).toString()); // [Object:myObject {value:30}]
2, 函數調用模式
當一個函數並不是一個對象的函數時,那麼它被看成一個函數來調用,this被綁定到全局對象上。這是語言設計的一個錯誤。假若語言設計正確,當內部函數調用時,this應該仍然綁定到外部函數的this變量上
var myObject={
    name : "myObject" ,
    value : 0 ,
    increment : function(num){
        this.value += typeof(num) === 'number' ? num : 0;
        return this;
    } ,
    toString : function(){
        return '[Object:' + this.name + ' {value:' + this.value + '}]';
    },
    getInfo: function(){
        var self=this;
        return (function(){
//            return this.toString(); // 內部匿名函數中this指向了全局對象window, 輸出 [object Window]
            return self.toString(); // 定義一個變量self並給它賦值爲this,那麼內部函數經過該變量訪問到指向該對象的this
        })();
    }
};
alert(myObject.increment(10).increment(20).toString()); // [Object:myObject {value:30}]
3, 構造器調用模式 JS是一門基於原型繼承的語言, 這意味着對象能夠直接從其餘對象繼承屬性, 該語言是無類別的。
若是一個函數前面帶上new來調用,那麼將建立一個隱藏鏈接到該函數的prototype成員的新對象,同時this將會被綁定到構造函數的實例上
function MyObject(name){
    this.name = name || 'MyObject';
    this.value=0;
    this.increment = function(num){
        this.value += typeof(num) === 'number' ? num : 0;
    };
    this.toString = function(){
        return '[Object:' + this.name + ' {value:' + this.value + '}]';
    };
    this.target = this;
}編程

MyObject.prototype.getInfo = function(){
    return this.toString();
};
構造器調用函數,同時建立一個MyObject.prototype對象,myObject繼承了MyObject.prototype的全部的屬性, this綁定到了MyObject的實例上
var myObject = new MyObject();
myObject.increment(10);
alert(myObject.value); //10數組

alert(myObject.target===myObject); // true
alert(myObject.target.getInfo()); // [Object:MyObject {value:10}]
4, Apply調用模式 JS是一門函數式的面向對象編程語言,因此函數能夠擁有方法。
函數的apply方法,如同該對象擁有此方法,此時this指向該對象,apply接收兩個參數,第一個是要綁定的對象(this指向的對象),第二個是參數數組
function MyObject(name){
    this.name = name || 'MyObject';
    this.value = 0;
    this.increment = function(num){
        this.value += typeof(num) === 'number' ? num : 0;
    };
    this.toString=function(){
        return '[Object:'+this.name+' {value:'+this.value+'}]';
    };
    this.target=this;
}
function getInfo(){
    return this.toString();
}
var myObj = new MyObject();
alert(getInfo.apply(myObj)); //[Object:MyObject {value:0}], this指向myObj
alert(getInfo.apply(window)); //[object Window], this指向windowapp

相關文章
相關標籤/搜索