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 相关文章推荐
用倒置滤镜把div倒置,再把table倒置。
Jul 31 Javascript
javascript中定义类的方法详解
Feb 10 Javascript
有关Promises异步问题详解
Nov 13 Javascript
jQuery使用Selectator插件实现多选下拉列表过滤框(附源码下载)
Apr 08 Javascript
javascript中异常处理案例(推荐)
Oct 03 Javascript
jQuery实现链接的title快速出现的方法
Feb 20 Javascript
Bootstrap导航中表单简单实现代码
Mar 06 Javascript
vue一步步实现alert功能
Jul 05 Javascript
vue微信分享出来的链接点开是首页问题的解决方法
Nov 28 Javascript
微信小程序 拍照或从相册选取图片上传代码实例
Aug 28 Javascript
JS原型prototype和__proto__用法实例分析
Mar 14 Javascript
ajax jquery实现页面某一个div的刷新效果
Mar 04 jQuery
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
MySQL GBK→UTF-8编码转换
2007/05/24 PHP
PHP中创建图像并绘制文字的例子
2014/11/19 PHP
thinkphp中U方法按路由规则生成url的方法
2018/03/12 PHP
laravel框架上传图片实现实时预览功能
2019/10/14 PHP
iframe跨域通信封装详解
2015/08/11 Javascript
jquery关于事件冒泡和事件委托的技巧及阻止与允许事件冒泡的三种实现方法
2015/11/27 Javascript
jQuery Validate表单验证入门学习
2015/12/18 Javascript
JS实现1000以内被3或5整除的数字之和
2016/02/18 Javascript
JavaScript中windows.open()、windows.close()方法详解
2016/07/28 Javascript
详解js的延迟对象、跨域、模板引擎、弹出层、AJAX【附实例下载】
2016/12/19 Javascript
100行代码理解和分析vue2.0响应式架构
2017/03/09 Javascript
jQuery树插件zTree使用方法详解
2017/05/02 jQuery
Vue.js项目部署到服务器的详细步骤
2017/07/17 Javascript
Angular实现的简单查询天气预报功能示例
2017/12/27 Javascript
如何使用VuePress搭建一个类型element ui文档
2019/02/14 Javascript
Javascript三种字符串连接方式及性能比较
2019/05/28 Javascript
Weex开发之地图篇的具体使用
2019/10/16 Javascript
详解Vue中的Props与Data细微差别
2020/03/02 Javascript
vuejs element table 表格添加行,修改,单独删除行,批量删除行操作
2020/07/18 Javascript
vue radio单选框,获取当前项(每一项)的value值操作
2020/09/10 Javascript
Python图片的横坐标汉字实例
2019/12/04 Python
Python使用pyexecjs代码案例解析
2020/07/13 Python
Python 实现二叉查找树的示例代码
2020/12/21 Python
CSS3打造百度贴吧的3D翻牌效果示例
2017/01/04 HTML / CSS
详解HTML5中rel属性的prefetch预加载功能使用
2016/05/06 HTML / CSS
HTML table 表格边框的实现思路
2019/10/12 HTML / CSS
夏洛特和乔治婴儿和儿童时装精品店:Charlotte and George
2018/06/06 全球购物
金山毒霸系列的笔试题
2013/04/13 面试题
40岁生日感言
2014/02/15 职场文书
年终工作总结范文2014
2014/11/27 职场文书
文员岗位职责
2015/02/04 职场文书
结婚通知短信怎么写
2015/04/17 职场文书
标准发言稿结尾
2019/07/18 职场文书
解决hive中导入text文件遇到的坑
2021/04/07 Python
MySQL大小写敏感的注意事项
2021/05/24 MySQL
80行代码写一个Webpack插件并发布到npm
2021/05/24 Javascript