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 相关文章推荐
[原创]IE view-source 无法查看看源码 JavaScript看网页源码
Jul 19 Javascript
javascript中字符串拼接需注意的问题
Jul 13 Javascript
jQuery动态显示和隐藏datagrid中的某一列的方法
Dec 11 Javascript
js Dialog 去掉右上角的X关闭功能
Apr 23 Javascript
Jquery实现仿腾讯微博发表广播
Nov 17 Javascript
JavaScript之AOP编程实例
Jul 17 Javascript
什么是JavaScript中的结果值?
Oct 08 Javascript
KnockoutJS 3.X API 第四章之表单value绑定
Oct 10 Javascript
原生js实现网页顶部自动下拉/收缩广告效果
Jan 20 Javascript
JavaScript中Object值合并方法详解
Dec 22 Javascript
详解Vue2.0组件的继承与扩展
Nov 23 Javascript
基于Taro的微信小程序模板消息-获取formId功能模块封装实践
Jul 15 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数组函数序列之array_keys() - 获取数组键名
2011/10/30 PHP
ajax返回值中有回车换行、空格的解决方法分享
2013/10/24 PHP
php实现设计模式中的单例模式详解
2014/10/11 PHP
PHP实现可添加水印与生成缩略图的图片处理工具类
2018/01/16 PHP
关于laravel 日志写入失败问题汇总
2019/10/17 PHP
php 的多进程操作实践案例分析
2020/02/28 PHP
PHP实现文件上传与下载
2020/08/28 PHP
基于JQuery的一句代码实现表格的简单筛选
2010/07/26 Javascript
微博@符号的用户名提示效果。(想@到谁?)
2010/11/05 Javascript
js获取系统的根路径实现介绍
2013/09/08 Javascript
js利用prototype调用Array的slice方法示例
2014/06/09 Javascript
jQuery蓝色风格滑动导航栏代码分享
2015/08/19 Javascript
快速学习JavaScript的6个思维技巧
2015/10/13 Javascript
三种带箭头提示框总结实例
2016/06/14 Javascript
jQuery中实现prop()函数控制多选框(全选,反选)
2016/08/19 Javascript
jQuery源码分析之sizzle选择器详解
2017/02/13 Javascript
史上最全JavaScript常用的简写技巧(推荐)
2017/08/17 Javascript
Vue实现双向绑定的原理以及响应式数据的方法
2018/07/02 Javascript
vue.js引入外部CSS样式和外部JS文件的方法
2019/01/06 Javascript
详解Vue、element-ui、axios实现省市区三级联动
2019/05/07 Javascript
jQuery实现鼠标拖动图片功能
2021/03/04 jQuery
[43:43]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第三场 11.29
2020/12/02 DOTA
Python实现树莓派WiFi断线自动重连的实例代码
2017/03/16 Python
Pycharm学习教程(2) 代码风格
2017/05/02 Python
selenium使用chrome浏览器测试(附chromedriver与chrome的对应关系表)
2018/11/29 Python
python 图像平移和旋转的实例
2019/01/10 Python
Python 中包/模块的 `import` 操作代码
2019/04/22 Python
使用python将最新的测试报告以附件的形式发到指定邮箱
2019/09/20 Python
将pytorch转成longtensor的简单方法
2020/02/18 Python
Python能做什么
2020/06/02 Python
python多线程semaphore实现线程数控制的示例
2020/08/10 Python
Brora官网:英国领先的羊绒服装品牌
2019/08/28 全球购物
党员实事承诺书
2014/03/26 职场文书
教师作风整改措施思想汇报
2014/10/12 职场文书
会计继续教育培训心得体会
2016/01/19 职场文书
vue使用Google Recaptcha验证的实现示例
2021/08/23 Vue.js