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 相关文章推荐
xml和web特殊字符
Apr 28 Javascript
两个select之间option的互相添加操作(jquery实现)
Nov 12 Javascript
用js脚本控制asp.net下treeview的NodeCheck的实现代码
Mar 02 Javascript
a标签click和href执行顺序探讨
Jun 23 Javascript
JS实现超过长度限制后自动跳转下一款文本框的方法
Feb 23 Javascript
JQuery实现文字无缝滚动效果示例代码(Marquee插件)
Mar 07 Javascript
JS实现线性表的顺序表示方法示例【经典数据结构】
Apr 11 Javascript
JS实现中文汉字按拼音排序的方法
Oct 09 Javascript
详解Vue 中 extend 、component 、mixins 、extends 的区别
Dec 20 Javascript
node跨域转发 express+http-proxy-middleware的使用
May 31 Javascript
Angular 实现输入框中显示文章标签的实例代码
Nov 07 Javascript
浅入深出Vue之自动化路由
Aug 06 Javascript
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
MayFish PHP的MVC架构的开发框架
2009/08/13 PHP
php 多关键字 高亮显示实现代码
2012/04/23 PHP
PHP编程获取图片的主色调的方法【基于Imagick扩展】
2017/08/02 PHP
PHP attributes()函数讲解
2019/02/03 PHP
Javascript的&&和||的另类用法
2014/07/23 Javascript
JavaScript生成的动态下雨背景效果实现方法
2015/02/25 Javascript
JavaScript实现邮箱地址自动匹配功能代码
2016/11/28 Javascript
Vue cli 引入第三方JS和CSS的常用方法分享
2018/01/20 Javascript
Vue+webpack项目基础配置教程
2018/02/12 Javascript
Vue 中axios配置实例详解
2018/07/27 Javascript
vue-cli 打包使用history模式的后端配置实例
2018/09/20 Javascript
layui 弹出层值回传解决方式
2019/11/14 Javascript
微信域名检测接口调用演示步骤(含PHP、Python)
2019/12/08 Javascript
JavaScript中Object、map、weakmap的区别分析
2020/12/15 Javascript
使用python实现拉钩网上的FizzBuzzWhizz问题示例
2014/05/05 Python
Python正则表达式匹配ip地址实例
2014/10/09 Python
Apache如何部署django项目
2017/05/21 Python
python元组的概念知识点
2019/11/19 Python
用openCV和Python 实现图片对比,并标识出不同点的方式
2019/12/19 Python
Python实现冒泡排序算法的完整实例
2020/11/04 Python
美国50岁以上单身人士约会平台:SilverSingles
2018/06/29 全球购物
Haglöfs瑞典官方网站:haglofs火柴棍,欧洲顶级户外品牌
2018/10/18 全球购物
大学生怎样进行自我评价
2013/12/07 职场文书
自动化专业个人求职信范文
2013/12/30 职场文书
个人简历自我评价
2014/01/06 职场文书
工作表扬信的范文
2014/01/10 职场文书
社区国庆节活动方案
2014/02/05 职场文书
班级活动总结格式
2014/08/30 职场文书
装配出错检讨书
2014/09/23 职场文书
年度考核个人总结
2015/03/06 职场文书
绿色环保倡议书
2015/04/28 职场文书
2015国庆节感想
2015/08/04 职场文书
2016年度农村党员干部主题教育活动总结
2016/04/06 职场文书
pytorch 实现在测试的时候启用dropout
2021/05/27 Python
SQL语句多表联合查询的方法示例
2022/04/18 MySQL
vue-treeselect的基本用法以及解决点击无法出现拉下菜单
2022/04/30 Vue.js