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 相关文章推荐
Ext面向对象开发实践(续)
Nov 18 Javascript
使用 JScript 创建 .exe 或 .dll 文件的方法
Jul 13 Javascript
浅析javascript中函数声明和函数表达式的区别
Feb 15 Javascript
HTML5游戏引擎LTweenLite实现的超帅动画效果(附demo源码下载)
Jan 26 Javascript
基于BootStrap Metronic开发框架经验小结【一】框架总览及菜单模块的处理
May 12 Javascript
js获取ip和地区
Mar 10 Javascript
JavaScript获取URL参数的方法之一
Mar 24 Javascript
javascript 跨域问题以及解决办法
Jul 17 Javascript
javascript字体颜色控件的开发 JS实现字体控制
Nov 27 Javascript
创建Vue项目以及引入Iview的方法示例
Dec 03 Javascript
vue+高德地图写地图选址组件的方法
May 18 Javascript
JS数组索引检测中的数据类型问题详解
Jan 11 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 方便水印和缩略图的图形类
2009/05/21 PHP
基于MySQL体系结构的分析
2013/05/02 PHP
PHP写的资源下载防盗链类分享
2014/05/12 PHP
CodeIgniter框架实现的整合Smarty引擎DEMO示例
2019/03/28 PHP
javascript里的条件判断
2007/02/27 Javascript
简略的前端架构心得&&基于editor为例子的编码小技巧
2010/11/25 Javascript
ExtJS如何设置与获取radio控件的选取状态
2014/01/22 Javascript
jQuery网页右侧广告跟随滚动代码分享
2020/04/20 Javascript
Bootstrap基本插件学习笔记之Alert警告框(20)
2016/12/08 Javascript
浅析JavaScript动画模拟拖拽原理
2016/12/09 Javascript
JS实现全屏的四种写法
2016/12/30 Javascript
input输入框内容实时监测(附代码)
2017/08/15 Javascript
Vue下的国际化处理方法
2017/12/18 Javascript
Angular实现的进度条功能示例
2018/02/18 Javascript
jQuery+Cookie实现切换皮肤功能【附源码下载】
2018/03/25 jQuery
LayUi中接口传数据成功,表格不显示数据的解决方法
2018/08/19 Javascript
深入剖析JavaScript instanceof 运算符
2019/06/14 Javascript
《Python之禅》中对于Python编程过程中的一些建议
2015/04/03 Python
python集合类型用法分析
2015/04/08 Python
django小技巧之html模板中调用对象属性或对象的方法
2018/11/30 Python
Python中出现IndentationError:unindent does not match any outer indentation level错误的解决方法
2020/04/18 Python
对Python生成汉字字库文字,以及转换为文字图片的实例详解
2019/01/29 Python
Python 3.8新特征之asyncio REPL
2019/05/28 Python
Python代码太长换行的实现
2019/07/05 Python
django foreignkey(外键)的实现
2019/07/29 Python
softmax及python实现过程解析
2019/09/30 Python
使用Keras训练好的.h5模型来测试一个实例
2020/07/06 Python
python中如何设置代码自动提示
2020/07/15 Python
Python Django路径配置实现过程解析
2020/11/05 Python
Python包资源下载路径报404解决方案
2020/11/05 Python
西班牙在线药店:DosFarma
2020/03/28 全球购物
如果NULL和0作为空指针常数是等价的,那我到底该用哪一个
2014/09/16 面试题
大学中国梦演讲稿
2014/04/23 职场文书
2015年幼儿园大班工作总结
2015/04/25 职场文书
pytorch finetuning 自己的图片进行训练操作
2021/06/05 Python
一篇文章带你学习Mybatis-Plus(新手入门)
2021/08/02 Java/Android