函數

 

變量以及作用域

  • 函數內生命的變量,則改變量的作用域爲這個函數體,函數外部不可用。
  • 如果有兩個函數,兩個函數內聲明瞭相同的變量,該變量只在各自函數體內起作用,即函數體內聲明的變量互相獨立,互不影響。
  • 當函數嵌套函數時,內部函數可以訪問外部函數的變量,反過來則不行。
  • var 和 let 聲明一個變量。
  • const定義一個常量,常量不可以修改。let和const都具有塊級作用域。

 

方法

在一個對象內綁定函數,稱爲這個對象的方法。

var xiaoming = {
    birth: 1990,
    age: function(){
        var y = new Date().getFullYear();
        return y - this.birth
    }
}

xiaoming.age()//29

一個方法內部,this爲一個特殊的變量,永遠指向的是該對象,也就是xiaoming這個變量,this.birth可以拿到的是xiaoming裏面的birth屬性。

function getAge(){
    var y = new Date().getFullYear();
    return y - this.birth
}
var xiaoming = {
    birth: 1990,
    age: getAge
}

xiaoming.age()//29
getAge()//NaN

調用 getAge() 時,this指向的是全局window,由於全局未定義birth這個變量,所以返回的結果爲NaN。而xiaoming.age()調用getAge()時this指向的是xiaoming這個對象。注意

var xiaoming = {
    birth: 1990,
    age: function(){
        var y = new Date().getFullYear();
        return y - this.birth
    }
}

var fn = xiaoming.age;
fn()//NaN

此時的this指向也是不正確的,須用obj.xxx()調用。

var xiaoming = {
    name: '小明',
    birth: 1990,
    age: function () {
        function getAge(){
            var y = new Date().getFullYear();
            return y - this.birth;
        }
        return getAge()
    }
};
xiaoming.age()//NaN

this只指在age方法的函數中指向xiaoming,在方法的函數的內部函數中,指向又爲undefined。修改方法:

var xiaoming = {
    name: '小明',
    birth: 1990,
    age: function () {    
        var that = this;
        function getAge(){
            var y = new Date().getFullYear();
            return y - that.birth;
        }
        return getAge()
    }
};
xiaoming.age()//29

apply和 call 

指定函數 this 指定哪個對象時,可用函數本身方法apply,call。apply接收另兩個參數,第一個參數就是需要綁定的this變量,第二個參數爲Array。call與apply的區別就是參數按順序傳入

function getAge(){
    var y = new Date().getFullYear();
    return y - this.birth;
}
var xiaoming = {
    name: '小明',
    birth: 1990,
    age:getAge
};

getAge.apply(xiaoming,[])//29
getAge.call(xiaoming,null)//29

 

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