文章目录
1.this指针
- 1.this指针
- 2.作者答疑
如何有效的利用好JS中的this关键词,关系编程效率,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象。
//例子1
var o = {
user:"知了",
fn:function(){
console.log(this.user); //知了
}
}
o.fn();
如果一个函数中有this,但是它没有被上一级的对象所调用,那么this指向的就是window。
//例子2
var o = {
a:10,
b:{
a:12,
fn:function(){
console.log(this.a); //undefined
console.log(this); //window
}
}
}
var j = o.b.fn;
j();
this永远指向的是最后调用它的对象,也就是看它执行的时候是谁调用的,例子2中虽然函数fn是被对象o所引用,但是在将fn赋值给变量j的时候并没有执行,所以最终指向的是window,这和例子1是不一样的,例子1是直接执行了fn。
function Fn(){
this.user = "万千知了";
}
var a = new Fn();
console.log(a.user); //万千知了
这里之所以对象a可以点出函数Fn里面的user是因为new关键字可以改变this的指向,将这个this指向对象a,为什么我说a是对象,因为用了new关键字就是创建一个对象实例。
最后一个小问题:
function fn()
{
this.user = '万千知了';
return {};
}
var a = new fn;
console.log(a.user); //undefined
function fn()
{
this.user = '万千知了';
return function(){};
}
var a = new fn;
console.log(a.user); //undefined
function fn()
{
this.user = '万千知了';
return 1;
}
var a = new fn;
console.log(a.user); //万千知了
function fn()
{
this.user = '万千知了';
return undefined;
}
var a = new fn;
console.log(a.user); //万千知了
如果返回值是一个对象,那么this指向的就是那个返回的对象,如果返回值不是一个对象那么this还是指向函数的实例。
function fn()
{
this.user = '万千知了';
return undefined;
}
var a = new fn;
console.log(a); //fn {user: "万千知了"}
还有一点就是虽然null也是对象,但是在这里this还是指向那个函数的实例,因为null比较特殊。
function fn()
{
this.user = '万千知了';
return null;
}
var a = new fn;
console.log(a.user); //万千知了
new一个空对象的时候,js内部的实现并不一定是用的apply方法来改变this指向的。
2.作者答疑如有疑问,请留言。