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事件列表解说
Dec 22 Javascript
JS TextArea字符串长度限制代码集合
Oct 31 Javascript
解析ScrollPic在ie8下只滚动一遍,然后变为空白 ie6,ie7,chrome,firefox正常
Jun 26 Javascript
Javascript技术难点之apply,call与this之间的衔接
Dec 04 Javascript
jquery插件EasyUI中form表单提交实例分享
Jan 11 Javascript
jQuery计算文本框字数及限制文本框字数的方法
Mar 01 Javascript
JavaScript中双向数据绑定详解
May 03 Javascript
jQuery实现简单的手风琴效果
Apr 17 jQuery
基于vue配置axios的方法步骤
Nov 09 Javascript
不使用 JS 匿名函数理由
Nov 17 Javascript
教你搭建按需加载的Vue组件库(小结)
Jul 29 Javascript
基于VSCode调试网页JavaScript代码过程详解
Jul 20 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
神族 Protoss 剧情介绍
2020/03/14 星际争霸
php 显示指定路径下的图片
2009/10/29 PHP
基于curl数据采集之单页面采集函数get_html的使用
2013/04/28 PHP
关于更改Zend Studio/Eclipse代码风格主题的介绍
2013/06/23 PHP
thinkphp 手机号和用户名同时登录
2017/01/20 PHP
Laravel使用模型实现like模糊查询的例子
2019/10/24 PHP
基于php伪静态的实现方法解析
2020/07/31 PHP
seajs1.3.0源码解析之module依赖有序加载
2012/11/07 Javascript
巧用js提交表单轻松解决一个页面有多个提交按钮
2013/11/17 Javascript
JQuery以JSON方式提交数据到服务端示例代码
2014/05/05 Javascript
Javascript毫秒数用法实例
2015/02/05 Javascript
纯javascript实现分页(两种方法)
2015/08/26 Javascript
Angularjs 动态改变title标题(兼容ios)
2016/12/29 Javascript
详解vue项目优化之按需加载组件-使用webpack require.ensure
2017/06/13 Javascript
关于axios如何全局注册浅析
2018/01/14 Javascript
vue中设置height:100%无效的问题及解决方法
2018/07/27 Javascript
layerUI下的绑定事件实例代码
2018/08/17 Javascript
使用Vue中 v-for循环列表控制按钮隐藏显示功能
2019/04/23 Javascript
vue 中的 render 函数作用详解
2020/02/28 Javascript
vue模块移动组件的实现示例
2020/05/20 Javascript
vue集成一个支持图片缩放拖拽的富文本编辑器
2021/01/29 Vue.js
Python生成验证码实例
2014/08/21 Python
python数据类型_字符串常用操作(详解)
2017/05/30 Python
python实现flappy bird游戏
2018/12/24 Python
Python 普通最小二乘法(OLS)进行多项式拟合的方法
2018/12/29 Python
python中Django文件上传方法详解
2020/08/05 Python
python中使用asyncio实现异步IO实例分析
2021/02/26 Python
Ramy Brook官网:美国现代女装品牌
2019/06/18 全球购物
体育活动总结范文
2014/05/04 职场文书
无房证明范本
2014/09/17 职场文书
医院党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2015羊年春节慰问信
2015/02/14 职场文书
北大自主招生自荐信
2015/03/04 职场文书
小学体育跳绳课教学反思
2016/02/16 职场文书
话题作文之自信作文
2019/11/15 职场文书
解决Go gorm踩过的坑
2021/04/30 Golang