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 相关文章推荐
基于jquery1.4.2的仿flash超炫焦点图播放效果
Apr 20 Javascript
各情景下元素宽高的获取实现代码
Sep 13 Javascript
jQuery动态地获取系统时间实现代码
May 24 Javascript
js获取当前页面的url网址信息
Jun 12 Javascript
jquery实现的淡入淡出下拉菜单效果
Aug 25 Javascript
js实现浮动在网页右侧的简洁QQ在线客服代码
Sep 04 Javascript
简单实现兼容各大浏览器的js复制内容到剪切板
Sep 09 Javascript
jquery 动态增加,减少input表单的简单方法(必看)
Oct 12 Javascript
Vue-resource拦截器判断token失效跳转的实例
Oct 27 Javascript
JS实现十字坐标跟随鼠标效果
Dec 25 Javascript
详解webpack的文件监听实现(热更新)
Sep 11 Javascript
antd form表单数据回显操作
Nov 02 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
PHP+Mysql+Ajax+JS实现省市区三级联动
2014/05/23 PHP
php根据指定位置和长度获得子字符串的方法
2015/03/17 PHP
全面解析PHP验证码的实现原理 附php验证码小案例
2016/08/17 PHP
Yii核心验证器api详解
2016/11/23 PHP
使用composer 安装 laravel框架的方法图文详解
2019/08/02 PHP
js关于字符长度限制的问题示例探讨
2014/01/24 Javascript
使用CSS样式position:fixed水平滚动的方法
2014/02/19 Javascript
extjs 如何给column 加上提示
2014/07/29 Javascript
jQuery内部原理和实现方式浅析
2015/02/03 Javascript
JavaScript实现自动变换表格边框颜色
2015/05/08 Javascript
javascript记住用户名和登录密码(两种方式)
2015/08/04 Javascript
javascript数组去重的六种方法汇总
2015/08/16 Javascript
js生成随机数的方法实例
2015/10/16 Javascript
Bootstrap项目实战之首页内容介绍(全)
2016/04/25 Javascript
javascript的BOM
2016/05/03 Javascript
jQuery改变form表单的action,并进行提交的实现代码
2016/05/25 Javascript
原生js实现自由拖拽弹窗代码demo
2016/06/29 Javascript
jQuery深拷贝Json对象简单示例
2016/07/06 Javascript
手挽手带你学React之React-router4.x的使用
2019/02/14 Javascript
小程序如何使用分包加载的实现方法
2019/05/22 Javascript
jqGrid表格底部汇总、合计行footerrow处理
2019/08/21 Javascript
js实现上下左右键盘控制div移动
2020/01/16 Javascript
python同步windows和linux文件
2019/08/29 Python
Python使用grequests(gevent+requests)并发发送请求过程解析
2019/09/25 Python
Python pyautogui模块实现鼠标键盘自动化方法详解
2020/02/17 Python
jupyter notebook 参数传递给shell命令行实例
2020/04/10 Python
德国机场停车位比较和预订网站:Ich-parke-billiger
2018/01/08 全球购物
全球最大的房车租赁市场:Outdoorsy
2018/09/19 全球购物
学生个人求职自荐信格式
2013/09/23 职场文书
副董事长岗位职责
2014/04/02 职场文书
小学语文课后反思精选
2014/04/25 职场文书
会计电算化专业求职信
2014/06/10 职场文书
观看《周恩来的四个昼夜》思想汇报
2014/09/12 职场文书
工作自我评价范文
2015/03/05 职场文书
张丽莉观后感
2015/06/16 职场文书
初一军训感言
2015/08/01 职场文书