this是Javascript中的一个关键字,主要是在函数的内部使用。
function run(){
this.name='Kim';
}
当函数调用时,this就代表一个自动产生的一个对象,而这个对象具体代表的谁呢?那就要看函数的具体应用环境了。
以下是关于this的几种不同调用时的情况。
第一种:最基本的函数调用
这种是函数的基本用法,直接在全局作用域中调用,那么this代表的就是全局对象window
function run(){
return this.name='Kitty';
}
alert(run()); // Kitty
证明this代表的是window,在函数的内部和外部都能访问到name
function run(){
return this.name='hello';
}
alert(run()); // hello
alert(window.name); //hello
第二种:函数作为对象的方法调用
此时this代表的就是方法所属的那个对象
function run(){
alert(this.name);
}
var box=new Object();
box.name='Kim';
box.run=run;
box.run(); // Kim
第三种:函数作为构造函数调用
这里所谓的构造函数,就是通过new关键字,生成的一个新的object对象,那么this指的就是这个新的对象
/*
alert(typeof box); //object 注意:这里的函数通过new关键字 构成的构造函数创建的对象是object类型的而并非function类型的
var box=new Function();
alert(typeof box1); //function
*/
var name='hello';
function run(){
this.name='Kim';
}
var box=new run();
alert(box.name); //Kim
alert(name); //hello 因为run里面的name指的是新生成的对象,而并非全局的对象,因此全局对象中的name并没有改变
第四种:函数的apply()调用
这个apply()是函数对象的一个方法,用于改变这个函数的调用对象(或者说调用作用域),它的第一个参数指定的就是被哪个对象调用.
var name='Kim';
function run(){
alert(this.name);
}
run();//这里直接调用,那么this代表全局对象
新创建一个对象
var o={};
o.name=1;
o.run=run;
o.run(); // 结果是1
o.run.apply(o); //用apply指定调用对象,这里指定为o, 结果是1 this就是o对象
alert(o.run.apply()); //当apply()参数为空,默认是全局对象,等价于apply(this). 这里改变了函数的调用对象为全局对象,那么结果就是Kim // this就是window对象
总结
1.全局范围内使用this,它代表全局对象
2.函数调用,它代表全局对象
3.作为方法调用box.run(),它代表方法所属的对象
4.通过构造函数new run(),它代表这个新创建的对象