JavaScript中this表示函数运行的时候自动生成的一个内部对象,只能在函数内部使用,下面是一个简单的例子:

function test(){
alert(this == window);
}
test();

code1 
有的时候this的使用会让许多人觉得琢磨不定,但是总结一句话就是谁调用的方法this就是指向谁下面我们分五个方面来介绍一下this

1.函数调用(指向window)

在我们平时定义一个函数的时候然后在调用它,就是指向的window对象,就像上面先定义了一个函数test,然后去调用它,其实真正调用test方法的是window对象(在JavaScript中都是对象.属性/方法,如果是window对象可以省略),这时候的this是指向window可以用下面的代码进行尝试:

 var a = 'out';
function test(){
alert(this.a);
}
test(); //out
var t = new test();
alert(t.a);// undefined undefined

2.作为构造函数调用

这个是指向的新的对象,其实这个例子在上面已经提出来了,下面只需改动上面的一个地方也就是在test的函数中加上this.a=a,输出的结果就不同了,看下面的代码:

var a = 'out';
function test(){
this.a = a;
alert(this.a);
}
test(); //out
var t = new test();
alert(t.a);// out out

第一的对象是指向的window第二个对象是指向t(test的实例化)这个对象

3.作为对象的方法调用

函数还可以作为某个对象的方法调用,这时候this就是这个上级的对象,

  function test(){
alert(this.x);
}
var o = {};
o.x=1;
o.m=test;
o.m(); //
//o.m=test(); //undefined

4.作为元素的节点

这次先看代码:

     var value = 'nihao';
function f1(){
alert(this.value);
}
var val = document.getElementById('email');
val.onclick=f1;

下面是一行的HTML代码:

<input id="email" type="text" />

在点击input之后我们会看到弹出的是我们输入的值,而不是window对象的’nihao’,这是 因为每一个获取的DOM元素也是一个对象;

5.call()和apply()

这两个函数的作用是相同的语法有一点不同; 
他的作用是改变函数的调用对象,他的第一个参数就表示改变后的调用这个函数的对象(就是改变使用这个函数对象的this指向) 
看下面的代码:

    var name="helios";
function setName(addr,weight){
console.log(this.name+'---'+addr+'---'+weight);
console.log('wancheng');
}
var cat = {name:'hei',age:12},
dog = {name:'gou'};
setName.call(dog,'shangsha',32);
setName.apply(cat,['beijing',21]);

call()方法第一个参数传递的是调用这个方法的对象的this指向(上面的例子就是setName的this指向dog),后面还可以有多个参数分别是实际参数 
apply()一共能有两个参数第一个参数和call方法是一样的,第一个参数是实际参数的数组

非预期效果

this的主要应用前面已经介绍完了,但是在使用this的时候,初学者很容易使用this不当,造成非预期效果下面就来说明一下:

var obj={
bar:"yuansu",
foo:function(){
(function(){
alert(this.bar);//这个this指向的window对象 会弹出undefined;
})()
}
}
obj.foo();

这里先要指出一个误区,不是在函数里面定义的函数,this就是指向的上一级函数的this这是不正确的,在函数里面定义的函数也是要看是谁调用的这个函数(方法)this才是谁;在这里并不是obj调用foo里面的匿名函数,实际上是window,如果想要达到预期的效果值许改一点代码就可以了,看下面代码:

    var obj={
bar:"yuansu",
foo:function(){
var self = this; //把obj这个对象用self保存下来
(function(){
alert(self.bar);//这里的self就是obj了
})()
}
}
obj.foo();

总结

调用形式 this指向
普通函数 window
构造函数 实例化后的对象
对象的方法 该对象
DOM节点 该节点对象
call或者apply 第一个参数

Javascript对this对象的理解的更多相关文章

  1. 全面理解Javascript中Function对象的属性和方法

    http://www.cnblogs.com/liontone/p/3970420.html 函数是 JavaScript 中的基本数据类型,在函数这个对象上定义了一些属性和方法,下面我们逐一来介绍这 ...

  2. javascript对象的理解

    从代码中体会javascript中的对象: <!DOCTYPE html> <html> <head> <meta charset="utf-8&q ...

  3. 谈谈对Javascript构造函数和原型对象的理解

    对象,是javascript中非常重要的一个梗,是否能透彻的理解它直接关系到你对整个javascript体系的基础理解,说白了,javascript就是一群对象在搅..(哔!).   常用的几种对象创 ...

  4. JavaScript对象的理解 及 字面量对象与数组的关系

    JavaScript的简单类型包括 数字.字符串.布尔值.null值.undefined值. 其他的值都是对象.对象是可变的键控集合.数组.函数.正则表达式都是对象. 对象是属性的容器,属性都是名字和 ...

  5. Javascript高级程序设计——面向对象之理解对象

    在面向对象语言中都有类的概念,通过类来创建具有属性和方法的对象.而ECMAScript中没有类的概念,ECMAScript中定义了对象:无需属性的集合,其属性值可以包含基本值.对象.或者函数. 在Ja ...

  6. 浅谈系列之 javascript原型与对象

    在我学习与使用javascript三个月中,我一直对javascript的继承关系以及prototype理解不清,导致很多时候为什么这么用说不出个所以然来.截止到本周为止,通过之前的学习以及自己的再学 ...

  7. JavaScript 基础回顾——对象

    JavaScript是基于对象的解释性语言,全部数据都是对象.在 JavaScript 中并没有 class 的概念,但是可以通过对象和类的模拟来实现面向对象编程. 1.对象 在JavaScript中 ...

  8. javascript中的对象,原型,原型链和面向对象

    一.javascript中的属性.方法 1.首先,关于javascript中的函数/“方法”,说明两点: 1)如果访问的对象属性是一个函数,有些开发者容易认为该函数属于这个对象,因此把“属性访问”叫做 ...

  9. JavaScript局部变量和全局变量的理解

    原文链接:http://www.cnblogs.com/eric-qin/p/4166552.html JavaScript局部变量和全局变量的理解   1 2 3 4 5 6 7 8 9 10 &l ...

随机推荐

  1. centos6.9实时查看tomcat运行日志

    1.切换到tomcat的logs目录下 cd /usr/local/apache-tomcat-/logs 2.执行命令,查看日志 tail -f catalina.out 3.退出 Ctrl+c

  2. ps 将图片四角变成圆角

    1.用PS打开一张图片,用矩形选框工具,选出你要保留的的那一部分,“选择→修改→平滑”.在弹出的选框里添入数值,值越大角就越圆. 2.选择“选择→反选”,再按delete删除就ok了.

  3. 03-body标签中的部分标签

    一.字体标签 标题标签h1-h6 h1定义最大的标题,h6定义最小的标题,一般一个页面中h1只能出现一次,尽量标题不要超过三级.h标签具有align属性,属性值分别是:left.center.righ ...

  4. python 写入txt的新方法

    最新发现有新方法可以对txt等进行操作,比较有意思,之前没见过,故记录下 传统方法 with open(ur'D:\Desktop\a123.txt', 'a') as f: #以写的方式打开 f.w ...

  5. 并发编程的模型分类(转载于https://link.zhihu.com/?target=http%3A//www.54tianzhisheng.cn/2018/02/28/Java-Memory-Model/)强烈推荐!

    在并发编程需要处理的两个关键问题是:线程之间如何通信 和 线程之间如何同步. 通信 通信 是指线程之间以何种机制来交换信息.在命令式编程中,线程之间的通信机制有两种:共享内存 和 消息传递. 在共享内 ...

  6. 基于SpringBoot+WebSocket搭建一个简单的多人聊天系统

    前言   今天闲来无事,就来了解一下WebSocket协议.来简单了解一下吧. WebSocket是什么   首先了解一下WebSocket是什么?WebSocket是一种在单个TCP连接上进行全双工 ...

  7. Kafka0.11之RoundRobinPartitioner/HashPartitioner(Scala):

    RoundRobinPartitioner/HashPartitioner: import java.util import java.util.concurrent.atomic.AtomicLon ...

  8. javascript随机点名--案例

    主要知识点涉及if选择结构判断语句.数组的定义.定时器.清除定时器.日期对象的使用. 1.HTML结构 <!DOCTYPE html> <html> <head> ...

  9. display值的作用分别是什么?relative和absolute分别是相对谁定位的?

    display值的作用分别是什么? none:元素隐藏,不占据位置 block:该元素显示为块级元素 inline:默认,该元素会被显示为内联元素 inline-block:行内块元素 list-it ...

  10. 我在用的翻译软件 -> 微软翻译+网易有道词典+谷歌翻译

    Windows网页翻译 因为微软翻译相对来说翻译网页更为准确,我也喜欢用谷歌的Chrome浏览器,但是我没找到微软翻译的扩展,这里只能放弃 这个需要配合Microsoft Edge浏览器进行使用,也是 ...