js中函数的4中调用方式
1作为普通函数来调用,this的值指向window,准确的说this为null,但是被解释成了window,但是在ECMA5标准中把null解释成了undefined
function foo(){
console.log(this.age);
}
foo();
2作为对象的方法来调用,this指向调用那一刻的调用者obj,也就是该对象
var obj={
xx:999,
yy:888,
t:function(){
alert(this.xx);//相当于obj.xx
}
};
obj.t();//999
/*关于调用“那一刻”的例子,虽然原来是obj在调用,
但是在dog.t=obj.t后,调用者成了dog,所以此时this指向了dog
*/
var dog ={
xx:'huzi'
};
dog.t=obj.t;
dog.t();//huzi
3作为构造函数调用时,也就是声明对象,因为在js中没有类的概念,创建对象是用构造函数来完成的,或者直接用json 来写对象。
形成1个空对象constructor,也就是{};
this指向该空对象
function Animal(name.age){
this.name = name;
this.age = age;
this.bark:function(){
console.log('i am'+this.name+'!');
}
/*this.bark中的this指向空对象constructor,但
是console中的this指向谁还不知道,因为此时还没有
调用者
*/
}
var dog = new Animal('huzi',5);//形成对象的一个实例,this此时指向了dog
dog.bark()//i am huzi
.函数作为构造函数时,return的值是忽略的,还是返回对象,
它绑定的this指向新创建的对象,并默认返回对象(this),也就是说,不需要在最后写return this;。
4 函数被call,apply调用时
'函数名.call(对象,参数1,参数2)'
function t(num){
console.log('我的真实年龄是' + this.age);
console.log('但我一般告诉别人我的年龄' + (this.age+num);
}
var zhangsan = {
'name':'zhangsan',
'age':30
}
t.call(zhangsan,5);
/*
首先,函数t中的this指向对象(zhangsan);
然后,运行t(参数1,参数2……参数n);
这个就是对象冒充
*/
网友评论