變量以及作用域
- 函數內生命的變量,則改變量的作用域爲這個函數體,函數外部不可用。
- 如果有兩個函數,兩個函數內聲明瞭相同的變量,該變量只在各自函數體內起作用,即函數體內聲明的變量互相獨立,互不影響。
- 當函數嵌套函數時,內部函數可以訪問外部函數的變量,反過來則不行。
- 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