JS中的this指向一直是个让人头疼的问题,想当初我学的是天昏地暗,查了好多资料,看的头都大了,跟他大战了那么多回合,终于把它搞定个七八分,其实往往都是我们复杂化了,现在就让大家轻松看懂this的指向,我会分以下几种情况来说。

this的指向:

 1 this 指的是直接调用当前方法(函数)的那个对象,也就是说函数在谁那被调用,this就指的是谁。

  来看两个栗子:

   oBtn.onclick = function(){
alert(this); //oBtn
} oBtn.onclick = fn1; function fn1(){ alert(this); //oBtn
}

很容易看出,函数是在按钮对象被点击的时候调用,所以this指的是obtn,这两种情况是等同的是,只是调用函数的写法不同。

2 当函数里面嵌套函数的时候,嵌套的那个函数里面的this指的是window,不要过分深究这个原因,因为这是JS的一个特性。

 来看个栗子:

oBtn.onclick = function(){

     alert(this); //oBtn(记得这里还是oBtn)

     fn1();
} function fn1(){
alert(this); // window
}

   对于上述情况,当我们需要fn1里面的this指向按钮的时候怎么办呢,这个时候有两种方法。

1 将this作为参数传函数去

2 将this保存起来赋给另一个变量

来看两个栗子:

1

oBtn.onclick = function(){

     alert(this); //oBtn

     fn1(this); 1 将上面的this作为参数传函数去
} function fn1(obj){
alert(obj); // oBtn
} 2 var that = null;
oBtn[i].onclick = function(){ alert(this); //oBtn
that = this ;// 将上面的this保存起来赋给另一个变量
fn1();
} function fn1(){
alert(that); // 指向oBtn
}

 后续补充

3  如果有new关键字,this指向new出来的那个对象;

当用new去调用一个函数:这个时候this指的就是创建出来的对象 而且函数的默认返回值就是this 即这个对象(隐式返回 不用自己再写返回值)

function CreatePerson(name){   //函数名首字母大写
//var this=new Object(); 系统会偷偷在这里声明一个对象赋给this替咱们做,不用写
this.name = name;
this.showName = function(){
alert(this.name);
}
//return this; 函数的默认返回值就是this即这个对象(隐式返回 不用自己再写返回值) }
var p1 =new CreatePerson('haha');
//当用new去调用一个函数:这个时候this指的就是创建出来的对象 而且函数的默认返回值就是this即这个对象(隐式返回 不用自己再写返回值)
p1.showName();

new操作符具体干了什么呢?

(1)创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。
(2)属性和方法被加入到 this 引用的对象中。
(3)新创建的对象由 this 所引用,并且最后隐式的返回 this 。

 4  在IE下,事件的绑定的第二种形式中,obj.attachEvent(事件名称,事件函数),里面的this指的是window。

当然这不是我们想要的,所以让this指向触发事件的对象呢?这就需要提到一个方法call();它可以改变this的指向

call(this的指向,原来函数的参数列表):它有两个参数,第一个指的是改变的this的指向,也就是你想要this指向谁就写谁,如果写的是null,this的指向就不会改变,还是指向原来的。从第二个参数开始,就代表的是函数里面的具体传入的参数了。具体用法我们来看个栗子:

 //有一个函数,两个参数。

function fn1(a,b){
alert(this); // 本来默认是window,改变后为1
alert(a+b);//
} //三种调用方法
fn1(); //正常调用。弹出 this指向window, a+b为 undefined
fn1.call(); // 等同于上面 ,这两种调用是一样的
fn1.call(1,10,20); // 弹出this指向 1,同时传入两个数,弹出30

改变this指向是不是也很简单呢。。。。。。

说点题外话,今天是我的第一篇博客,我平常呢,是个特别喜欢做笔记,也经常总结的人,只是写博客比较少,因为说不出来太多有文笔的东西,喜欢简单利索,逻辑分明的东西,希望以后我能更简单的将复杂的东西分享给你们,我们也一起学习,有什么不正确的,欢迎指正。

轻松了解JS中this的指向的更多相关文章

  1. 理解js中this的指向

         学习自原文  http://www.cnblogs.com/pssp/p/5216085.html后的一点小结(原文作者总结的很棒^_^)! 关于js中this的指向,在函数定义的时候还无法 ...

  2. js中this的指向

    在js中this的指向对于新手来说一定是个难题,但是如果你真正理解了的话,也就没什么问题啦,下面就来讲讲this吧. JS中,this的值取决于调用的模式(调用对象),而JS中共有4种调用模式: 1. ...

  3. JS中的this 指向问题

    我发现在对JS的学习中有很多朋友对this的指向问题还是有很大的误区或者说只是大致了解,但是一旦遇到复杂的情况就会因为this指向问题而引发各种bug. 对于之前学习过c或者是Java的朋友来说可能这 ...

  4. js中改变this指向的call、apply、bind 方法使用

    前言: 由于js 中this的指向受函数运行环境的影响,指向经常改变,使得开发变得困难和模糊,所以在封装sdk,写一些复杂函数的时候经常会用到this 指向绑定,以避免出现不必要的问题,call.ap ...

  5. js中 this 的指向

    js中 this的指向一共存在3种地方: 1.全局的this; 2.构造函数的this; 3.call/apply; 一.全局的this: function test(){ this.d = 3;// ...

  6. 彻底理解js中this的指向,不必硬背。

    首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然 ...

  7. 了解学习JS中this的指向

    [转] 首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问 ...

  8. JS中this的指向问题

    JS中this的定义:this对象是在运行时基于函数的执行环境绑定的(通俗点来说就是:this代表当前函数属于哪个对象). this一般情况下都代表的是global对象,在浏览器中就是window对象 ...

  9. Js中的this指向问题

    函数中的this指向和当前函数在哪定义的或者在哪执行的都没有任何的关系分析this指向的规律如下: [非严格模式]1.自执行函数中的this永远是window [案例1] var obj={ fn:( ...

随机推荐

  1. Python version 2.7 required, which was not found in the registry解决方法

    转自:https://blog.csdn.net/zklth/article/details/8117207 新建一个register.py文件,执行该文件,完成python的注册. import s ...

  2. SpringBoot(十七)-- 定时任务

    日常开发中,经常会使用定时任务来执行跑批,springboot默认已经帮助我们整合了定时任务. 参考:https://blog.csdn.net/u013845177/article/details/ ...

  3. 【netcore入门】在Windows IIS上部署.NET Core 2.1项目

    部署之前先检查下面2个先决条件是否满足 1.安装了 IIS 模块 win7 在 控制面板→程序和功能→打开或关闭Windows功能→勾选Internet 信息服务(Internet Informati ...

  4. 【zheng环境准备】安装redis

    1.下载源码,解压缩后编译源码 wget http://download.redis.io/release/redis-2.8.3.tar.gz tar -xzf redis-.tar.gz cd r ...

  5. 关于linux下mysql 5.7.x数据库的yum的安装方法

    环境介绍>>>>>>>>>>>>>>>>>> 操作系统:Centos 7.1 mysql数据 ...

  6. VMWare共有3种网络连接模式

     VMWare共有3种网络连接模式,分别是: 1. bridged(桥接模式):虚拟机将直接连接到物理局域网,使自身独立于宿主机外,从局域网路由器获取IP.这种方式虚拟OS可以和局域网中其他终端实现互 ...

  7. 10.15仿admin开发stark组件(一)

    2018-10-15 12:28:50 越努力,越幸运!永远不要高估自己! 低调做人,高调做事! 明天开stark项目!! admin 参考连接: http://www.cnblogs.com/yua ...

  8. hadoop fs 获取文件大小

    du 使用方法:hadoop fs -du URI [URI …] 显示目录中所有文件的大小,或者当只指定一个文件时,显示此文件的大小.示例:hadoop fs -du /user/hadoop/di ...

  9. iOS FMDB的是使用和注意事项

    1.FMDB 默认的使用方法不是线程安全的. 2.Sqlite 默认不支持外键. 3.Sqlite 不支持用 ALTER 关键字给已有表添加外键约束 解决: 1.FMDBDatabaseQueue 2 ...

  10. RabbitMQ的Q&A

    默认的IP端口 amqp默认绑定IP(本机所有IP),端口:5672 clustering默认绑定IP(本机所有IP),端口:25672 RabbitMQ Management插件 (本机所有IP), ...