今天上午主要学习了js中的 this ,因为之前学习面向对象时,this这个东西出现的还是很频繁的,理解的很不透彻,感觉老被JAVA的思想带进坑里,所以对它特别关注。

首先贴一个大神的一篇博客,我是通过这篇博客对this的认识和了解有了很大的提升,下面是传送门

foocoder----详解JavaScript中的this

首先,解释一下this到底是个什么东西。我找到的解释是这样的(读起来有点绕)

this是包含它的函数作为方法被调用时所属的对象。

this是包含它的函数作为方法被调用时所属的对象。

this是包含它的函数作为方法被调用时所属的对象。

重要的事情说三篇!下面列举一下this出现的几种情况。

第一种情况,全局代码中的this

alert(this)//window

第二种情况,普通的函数中调用的this(我说的普通,就是表示大家经常会写出来的那种。。。就是在全局作用域中调用的函数,例子如下)。

function fooCoder(x) {
this.x = x;
}
fooCoder(2);
alert(x);// 全局变量x值为2

这里的this包含在 fooCoder 函数中,而函数是被直接调用的(也就是在window中调用的),所以这个this指向window

第三种情况,构造函数中的this(之前见过许多次)

function Person(name){
this.name = name;
}; var tom = new Person("tom");

这里的this 指向的是通过构造函数 new 出来的那个tom对象。因为tom调用了 this所在的Person函数。

第四种情况,对象的方法中调用的this

Person.prototype.say = function (){
console.log(this.name +" say hello~");
}

这里的this 指向的是调用这个方法的对象。例如tom.say(),这时this指向的是tom。原理同上

第五种情况,this出现在内部函数中调用  类似这样

        this.name = "jerry";
Person.prototype.sayHello = function(){ sayfun = function(){
alert(this.name+" hello")
} sayfun(); //alert(this.name);
} var tom = new Person("tom");
tom.sayHello();//jerry hello

最外层的this就是第一种情况所说的全局环境直接调用this,这时候this就是window。

调用创建出来的对象 tom上的sayHello()函数,函数中包含一个内部函数sayfun(),这个内部函数中的this本来应该代表的是tom,但是当你运行程序后就发现alert 出来的 是 "jerry hello",就说明 这里的this 指向了window。

为什么会这样呢?  首先找找看到底是谁调用了 sayfun()函数。这里可能会误解为是tom这个对象调用了sayfun函数,其实真相是 tom调用了sayHello函数,而sayHello函数内部执行了sayfun函数,并不是tom调用的。那是谁调用的?这种直接调用的一般都是window干的。所以这里的this还是指向window的。

如果想要实现想要的效果,让this指向tom,可以进行这样分析一下

tom调用了sayHello函数,那么sayHello函数中的this就还是指向tom的。而sayfun作为sayhello函数的内部函数是可以访问到sayhello函数的作用域的,所以我们在sayhello函数中保存一下this(比如把他保存为that)就可以让sayfun访问到这个保存的值。代码实现如下:

        function Person(name){
this.name = name;
} this.name = "jerry";
Person.prototype.sayHello = function(){
var that = this;
sayfun = function(){
alert(that.name+" hello")
} sayfun(); //alert(this.name);
} var tom = new Person("tom");
tom.sayHello();//tom hello


第六种情况,在apply(),call()这两个函数中的this。一般的实现是这样的

fun.call( this [,arg1,arg2,… ] );  // 参数列表,arg1,arg2,...
fun.apply(this [,argArray] ); // 参数数组,argArray

两者都是将某个函数绑定到某个具体对象上使用。这种情况之后下一篇专门分析。

除了以上几种情况外,还有关于事件处理函数中的this,也比较特殊,但是如果掌握里上面理解this的方法,也会变得很轻松。这部分内容我参考了这篇博客

事件处理函数的this ---yxc_gdut

浏览器有三种添加事件监听的方式。

第一种:直接在标签内写 onclick=“fn”

第二种:在js中 onclick=fn

第三种:在js中 用el.attachEvent或者el.addEventListener()

三种方式添加的事件处理函数运行的scope是不同的,不同浏览器也不尽相同。

IE

  • js: el.onclick = fn ,fn的this->el
  • 在div标签中 onclick = "fn()" ,fn的this->window
  • js: el.attachEvent('onclick',fn); ,fn的this->window

Firefox、Chrome、Opera

  • js: el.onclick = fn ,fn的this->el
  • 在标签中 onclick = "fn()" ,fn的this->window (相当于执行eval())
  • js: el.addEventListener('onclick',fn); ,fn的this->el

综上总结一下:

如果在函数中使用了this,只有在该函数直接被某对象调用时(代码中肉眼可见的调用,例如a = fn()或者 a.fn() 这种),该this才指向该对象。

this在js中的出场频率还是挺高的,掌握了能识别this到底代表谁,对编程还是很有用的~~加油!!

2015年12月31日 晚6点19分

新年快乐

JavaScript 中 关于 this 的学习笔记的更多相关文章

  1. Javascript中回调函数的学习笔记

    function a_b(kkis){ document.body.style.background ='red'; kkis(); } function fli(){ alert('######## ...

  2. 《JavaScript DOM 编程艺术》 学习笔记

    目录 <JavaScript DOM 编程艺术> 学习笔记 第一章 js简史 第二章 js语法 准备工作 语法 第三章 DOM DOM中的D DOM中的O DOM中的M 第四章 js图片库 ...

  3. JavaSE中Collection集合框架学习笔记(2)——拒绝重复内容的Set和支持队列操作的Queue

    前言:俗话说“金三银四铜五”,不知道我要在这段时间找工作会不会很艰难.不管了,工作三年之后就当给自己放个暑假. 面试当中Collection(集合)是基础重点.我在网上看了几篇讲Collection的 ...

  4. JavaSE中Collection集合框架学习笔记(3)——遍历对象的Iterator和收集对象后的排序

    前言:暑期应该开始了,因为小区对面的小学这两天早上都没有像以往那样一到七八点钟就人声喧闹.车水马龙. 前两篇文章介绍了Collection框架的主要接口和常用类,例如List.Set.Queue,和A ...

  5. 浏览器中js执行机制学习笔记

    浏览器中js执行机制学习笔记 RiverSouthMan关注 0.0772019.05.15 20:56:37字数 872阅读 291 同步任务 当一个脚本第一次执行的时候,js引擎会解析这段代码,并 ...

  6. JavaScript闭包(Closure)学习笔记

    闭包(closure)是JavaScript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 下面就是我的学习笔记,对于JavaScript初学者应该是很有用的. 一.变量的作用域 要理解 ...

  7. 关于JavaScript中的创建对象的学习总结

    一.最简单的对象创建方法 在JavaScript中,直接使用Object构造函数或对象字面量都可以很轻易地创建单个对象,缺点是:创建具有同一个接口(标准的OO中的接口概念)的多个对象时,会有大量重复代 ...

  8. JavaScript设计模式之观察者模式(学习笔记)

    设计模式(Design Pattern)对于软件开发来说其重要性不言而喻,代码可复用.可维护.可扩展一直都是软件工程中的追求!对于我一个学javascript的人来说,理解设计模式似乎有些困难,对仅切 ...

  9. JavaSE中Collection集合框架学习笔记(1)——具有索引的List

    前言:因为最近要重新找工作,Collection(集合)是面试中出现频率非常高的基础考察点,所以好好恶补了一番. 复习过程中深感之前的学习不系统,而且不能再像刚毕业那样死背面试题,例如:String是 ...

随机推荐

  1. LeetCode——Binary Tree Level Order Traversal II

    Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...

  2. 《JavaScript 闯关记》之数组

    数组是值的有序集合.每个值叫做一个元素,而每个元素在数组中有一个位置,以数字表示,称为索引. JavaScript 数组是无类型的,数组元素可以是任意类型,并且同一个数组中的不同元素也可能有不同的类型 ...

  3. SCII码表 键盘常用ASCII码

    ASCII码对照表   在Web开发时,如下的ASCII码只要加上&#和;就可以变成Web可以辨认的字符了在处理特殊字符的时候特别有用,如:' 单引号在数据库查询的时候是杀手,但是如果转换成' ...

  4. @init 自定义

    相当于构造方法,有的时候初始化的时候有一些默认值,还有就是页面加载数据的时机问题,防止加载了页面再填数据 声明: -(instancetype)initWithName:(NSString *)aNa ...

  5. 如何让你的SQL运行得更快

    人们在使用SQL时往往会陷入一个误区,即太关注于所得的结果是否正确,而忽略了不同的实现方法之间可能存在的性能差异,这种性能差异在大型的或是复杂的数据库环境中(如联机事务处理OLTP或决策支持系统DSS ...

  6. C# Winform程序本地化应用

    1. 创建一个WinForm应用程序 – “WindowsFormsLocalizationTest”. 2. 在主窗体属性栏里,把Localizable属性设置成”True”. 3. 添加两个But ...

  7. python运维开发(十三)----SQLalchemy和paramiko续

    内容目录: ORM架构SQLalchemy Paramiko SQLalchemy对表的操作 使用 ORM/Schema Type/SQL Expression Language/Engine/Con ...

  8. Train Problem II

    问题陈述: HDOJ Problem - 1023 问题解析: 卡特兰数(Catalan)的应用 基本性质: f(n) = f(1)f(n-1) + f(2)f(n-2) + ... + f(n-2) ...

  9. 阿里云 配置apache+python+django 环境 适合菜鸟

    云服务器环境:阿里云服务:20G+1M带宽+centos+512M 一.python安装: 刚开始没有好好利用centos 的yum方法.采用wget从python官网上下载的2.7.5版本.解压安装 ...

  10. ui的设计原则

    部分网页设计原则 规划目录结构时应当遵循的几个原则: 1.不要将所有文件都存放在根目录下; 2.按栏目内容分别建立子目录; 3.在每个主目录下都建立独立的images目录; 4.目录的层次不要太深; ...