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脚本
Aug 04 Javascript
javascript 鼠标拖动图标技术
Feb 07 Javascript
JS实现在Repeater控件中创建可隐藏区域的代码
Sep 16 Javascript
基于jQuery的星级评分插件
Aug 12 Javascript
jquery实现动态菜单的实例代码
Nov 28 Javascript
javascript每日必学之继承
Feb 23 Javascript
jQuery mobile的header和footer在点击屏幕的时候消失的解决办法
Jul 01 Javascript
简单实现js页面切换功能
Jan 10 Javascript
JavaScript trim 实现去除字符串首尾指定字符的简单方法
Dec 27 Javascript
javascript中BOM基础知识总结
Feb 14 Javascript
Node做中转服务器转发接口
Oct 18 Javascript
浅谈vue生命周期共有几个阶段?分别是什么?
Aug 07 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 JSON中文乱码的解决方法详解
2013/06/06 PHP
PHP编译安装中遇到的两个错误和解决方法
2014/08/20 PHP
PHP cookie与session会话基本用法实例分析
2019/11/18 PHP
让IE6支持min-width和max-width的方法
2010/06/25 Javascript
js在数组中删除重复的元素自保留一个(两种实现思路)
2014/08/22 Javascript
下雪了 javascript实现雪花飞舞
2020/08/02 Javascript
nodeJS(express4.x)+vue(vue-cli)构建前后端分离实例(带跨域)
2017/07/05 NodeJs
前端跨域的几种解决方式总结(推荐)
2017/08/16 Javascript
Vue Cli与BootStrap结合实现表格分页功能
2017/08/18 Javascript
js封装成插件的步骤方法
2017/09/11 Javascript
Vue实现简单分页器
2018/12/29 Javascript
解决layui调用自定义方法提示未定义的问题
2019/09/14 Javascript
vue elementui tree 任意级别拖拽功能代码
2020/08/31 Javascript
解决vue组件没显示,没起作用,没报错,但该显示的组件没显示问题
2020/09/02 Javascript
一个检测OpenSSL心脏出血漏洞的Python脚本分享
2014/04/10 Python
详解python 发送邮件实例代码
2016/12/22 Python
python实现换位加密算法的示例
2018/10/14 Python
django项目中使用手机号登录的实例代码
2019/08/15 Python
numpy ndarray 按条件筛选数组,关联筛选的例子
2019/11/26 Python
Tensorflow矩阵运算实例(矩阵相乘,点乘,行/列累加)
2020/02/05 Python
利用Python如何实时检测自身内存占用
2020/05/09 Python
在pycharm中创建django项目的示例代码
2020/05/28 Python
PyCharm 2020.2.2 x64 下载并安装的详细教程
2020/10/15 Python
Python爬虫之Selenium多窗口切换的实现
2020/12/04 Python
针对HTML5的Web Worker使用攻略
2015/07/12 HTML / CSS
世界第一冲浪品牌:O’Neill
2016/08/30 全球购物
资源环境与城市管理专业推荐信
2013/11/30 职场文书
百度吧主申请感言
2014/01/12 职场文书
2014年人力资源部工作总结
2014/11/19 职场文书
房地产销售经理岗位职责
2015/02/02 职场文书
漂亮妈妈观后感
2015/06/08 职场文书
功夫熊猫观后感
2015/06/10 职场文书
出纳2015年度工作总结范文
2015/10/14 职场文书
56句经典英文座右铭
2019/08/09 职场文书
Python入门之基础语法详解
2021/05/11 Python
《帝国时代4》赛季预告 新增内容编译器可创造地图
2022/04/03 其他游戏