对this的浅显的理解

谁调用this就指向谁!当没有明确调用对象时。this指向window!

先记住一个事,window是对象,是被实例化的对象,实例化过程是在页面加载的时候由JavaScript引擎完成的;
在JavaScript里直接使用this,this执行指向window;

函数声明会在全局作用域构造的时候完成,所以函数声明是window对象的属性,所以不管在哪里声明函数,声明函数最终都是属于window对象,声明函数里的this是指向window的;

函数表达式的this也指向window,当他被写在另一个函数里面也是这样;
其实,在JavaScript里面,任何匿名函数都是属于window对象,他们也是在全局作用域构造的时候完成定义和赋值,在定义匿名函数的时候它会返回自己的内存地址;

this都是指向实例化对象;
如果要把this从window变成其他对象,那么就得让function被实例化--使用new操作符;
使用了new操作符实例化的对象的this指向的是Object实例;
通过字面量方式定义对象的方式是new Object的简写,二者是等价的,所以里面的this也是指向Object实例的;

call和apply将this指针指向方法的第一个参数,如果没有参数的话,指向window;
bind也可以改变this的指向;
(这三个的区别:apply、call、bind的区别

如果给定义对象里面传入了函数
传入的参数是函数的别名,那么函数的this就指向window;
传入的参数是被new过的构造函数,那么this 就指向实例化的对象本身;
如果想把被传入的函数对象里this的指针指向外部字面量定义的对象,那么就是用apply和call;

总结:在javascript 语言里没有通过new(包括对象字面量定义)、call和apply改变函数的this指针,函数的this指针都是指向window的;

例子:
var b = function() {

     console.log(this); 

     return function() {

          console.log(this);
     }
}
var c = b();   // ?window,函数表达式里的this指向window

c();   // ? window,c现在等于function() { console.log(this); }

var a = {

     fn : c
}

a.fn();   // ? Object,c在一个字面量里面,字面量创建的对象也相当于new了一次,所以
            //this指向一个实例对象

var e = {

     fn : function() {
          c();
     }
}

e.fn();    // ? window 这是一个匿名函数,this指向window,这里相当于
             //var e = {

             //      fn : function() {
             //           function() {
             //                console.log(this);
             //           }
             //      }
             //}



eval()--该函数执行时的作用域是当前作用域,等同于在该行将里面的代码填进去,所以虽然在指向的时候看起来没有指定当前对象,但是this不是指向window的;

关于addEventListener()和attachEvent():
在IE中,使用attachEvent进行事件绑定,this指向的是window而不是当前节点;
在其他浏览器中,使用adEventListener进行事件绑定,this指向的是当前节点;

这里有个关于作用域的文章:关于JavaScript的作用域

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值