javascript this详细介绍


Posted in Javascript onSeptember 19, 2016

this的值是在运行时确定的

JS中的this究竟代表什么,这是在程序运行时根据上下文环境确定,可以分为以下几种情况。

1. 全局作用域中的this

在全局作用域中,this指向window对象。

console.log(this);//指向window对象

this.x = 5//在全局作用域内创建一个x
//与this.x = 5的等价情况:
//var x = 5;
//x = 5;

在全局作用域中执行var x=5,其实是为window对象创建一个属性x,并令其等于5。

若定义变量时不加var,JS会认为该变量为全局变量,会将其当作window对象的属性。

2. 函数中的this

JS中函数有两种,直接调用的函数称为普通函数,通过new创建对象的函数称为构造函数。

2.1 构造函数中的this

构造函数的this指向它所创建的对象,如:

function Person(name){
  this.name = name;//this指向该函数创建的对象person
}
var person = new Person("chaimm");

2.2 普通函数中的this

普通函数的this指向window对象。
若上述例子,直接执行Perosn函数,则其中this代表window对象,因此该函数执行后会创建一个全局的name。

function Person(name){
  this.name = name;//this指向window
}
Person("chai");//当作普通函数执行,this指向window对象

3. 对象中的this

对象中的this指向当前对象,如:

var person = {
  name : "chaimm",
  getName : function(){
    return this.name;
  }
}

上述代码中this指向函数getName所属的对象。

但是,如果一个对象的函数中又嵌套了一个函数,这个函数的this指向的却是window,而并不是其外层的对象。

var person = {
  name : "chaimm",
  setName : function(name){
    (function(name){
      this.name = name; //此时this并不代表person对象,而是代表window对象
    })(name);
  }
}

上述示例中,person对象中有一个getName函数,而getName函数内部又有一个函数,这个函数内部的this指向window对象,而非person对象,这是JS的一个bug!一般作如下处理,规避这个bug:

var person = {
  name : "chaimm",
  setName : function(name){
    var thar = this;//将this赋给that
    (function(name){
      that.name = name;//此时that指向person对象
    })(name);
  }
}

我们在person对象的第一层函数中,将this赋给局部变量that,然后在第二层函数中使用that,此时that指向person对象,可对person的属性进行操作。

注意:若将一个对象中的函数赋给一个变量后,再通过该变量调用这个函数,此时该函数中的this指向window,而非该对象,如下所示:

var person = {
  name : "chaimm",
  getName : function(){
    return this.name;
  }
}

//将getName函数赋给一个新的变量
var newGetName = person.getName;
//通过新的变量调用这个函数,这个函数中的this将指向window
newGetName();//若全局作用域中没有name,则将返回undefined

4. 用call和apply函数给this开挂

这两个函数都能手动指定被调用函数内部的this指向哪个对象。

//定义一个构造函数
var Person = function(name){
  this.name = "";
  this.setName = function(name){
    this.name = name;
  }
}

//创建两个对象
var personA = new Person("A");
var personB = new Person("B");

//使用personA的setName函数去修改personB的name属性
personA.setName.apply(personB,["C"]);

apply用法

对象A.函数名.apply(对象B, 参数列表);
当对象B作为apply的第一个参数传给apply时,对象A的函数中this就指向了对象B,此时对象A的该函数对this的操作将会作用在对象B上,由此实现了用对象A去调用对象B的函数。

以上就是对javascript this的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!

Javascript 相关文章推荐
JavaScript Tips 使用DocumentFragment加快DOM渲染速度
Jun 28 Javascript
ajax异步刷新实现更新数据库
Dec 03 Javascript
jQuery探测位置的提示弹窗(toolTip box)详细解析
Nov 14 Javascript
多种方法实现360浏览器下禁止自动填写用户名密码
Jun 16 Javascript
node.js中的fs.read方法使用说明
Dec 17 Javascript
详解JavaScript正则表达式中的global属性的使用
Jun 16 Javascript
jquery插件treegrid树状表格的使用方法详解(.Net平台)
Jan 03 Javascript
Web开发使用Angular实现用户密码强度判别的方法
Sep 27 Javascript
微信小程序当前时间时段选择器插件使用方法详解
Dec 28 Javascript
如何利用javascript接收json信息并进行处理
Aug 06 Javascript
基于vue+echarts数据可视化大屏展示的实现
Dec 25 Vue.js
vue中使用echarts的示例
Jan 03 Vue.js
JS遍历ul下的li点击弹出li的索引的实现方法
Sep 19 #Javascript
vuejs在解析时出现闪烁的原因及防止闪烁的方法
Sep 19 #Javascript
javascript 判断页面访问方式电脑或者移动端
Sep 19 #Javascript
详解Node.Js如何处理post数据
Sep 19 #Javascript
React Native实现简单的登录功能(推荐)
Sep 19 #Javascript
在Web项目中引入Jquery插件报错的完美解决方案(图解)
Sep 19 #Javascript
BootStrap入门教程(二)之固定的内置样式
Sep 19 #Javascript
You might like
如何使用php绘制在图片上的正余弦曲线
2013/06/08 PHP
php object转数组示例
2014/01/15 PHP
分享3个php获取日历的函数
2015/09/25 PHP
基于PHP微信红包的算法探讨
2016/07/21 PHP
PHP如何将图片文件上传到另外一台服务器上
2019/08/26 PHP
WEB页子窗口(showModalDialog和showModelessDialog)使用说明
2009/10/25 Javascript
jQuery 顺便学习下CSS选择器 奇偶匹配nth-child(even)
2010/05/24 Javascript
推荐一款jQuery插件模板
2015/01/09 Javascript
js图片卷帘门导航菜单特效代码分享
2015/09/10 Javascript
js获取html的span标签的值方法(超简单)
2016/07/26 Javascript
使用JS判断移动端手机横竖屏状态
2018/07/30 Javascript
原生js无缝轮播插件使用详解
2020/03/09 Javascript
微信小程序学习总结(一)项目创建与目录结构分析
2020/06/04 Javascript
python实现用户登录系统
2016/05/21 Python
Python 遍历列表里面序号和值的方法(三种)
2017/02/17 Python
python入门教程之识别验证码
2017/03/04 Python
Python虚拟环境项目实例
2017/11/20 Python
python 常用的基础函数
2018/07/10 Python
启动Atom并运行python文件的步骤
2018/11/09 Python
Python实现计算字符串中出现次数最多的字符示例
2019/01/21 Python
tensorflow之自定义神经网络层实例
2020/02/07 Python
python读写文件write和flush的实现方式
2020/02/21 Python
django 前端页面如何实现显示前N条数据
2020/03/16 Python
python3获取控制台输入的数据的具体实例
2020/08/16 Python
给水排水工程专业毕业生推荐信
2013/10/28 职场文书
家居设计专业个人自荐信范文
2013/11/26 职场文书
浪费资源的建议书
2014/03/12 职场文书
周年庆促销方案
2014/03/15 职场文书
党员实事承诺书
2014/03/26 职场文书
走群众路线学习笔记
2014/11/06 职场文书
2014年安置帮教工作总结
2014/12/11 职场文书
2016年“9.22”世界无车日活动小结
2016/04/05 职场文书
如何理解Vue简单状态管理之store模式
2021/05/15 Vue.js
vue2实现provide inject传递响应式
2021/05/21 Vue.js
Python实现学生管理系统(面向对象版)
2021/06/24 Python
Java 常见的限流算法详细分析并实现
2022/04/07 Java/Android