变量以及作用域
- 函数内生命的变量,则改变量的作用域为这个函数体,函数外部不可用。
- 如果有两个函数,两个函数内声明了相同的变量,该变量只在各自函数体内起作用,即函数体内声明的变量互相独立,互不影响。
- 当函数嵌套函数时,内部函数可以访问外部函数的变量,反过来则不行。
- 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