JS中this上下文对象使用方式


Posted in Javascript onOctober 09, 2016

JavaScript 有一套完全不同于其它语言的对 this 的处理机制。 在五种不同的情况下 ,this 指向的各不相同。

有句话说得很在理 -- 谁调用它,this就指向谁

一、全局范围内

在全局范围内使用this ,它将指向全局对象(浏览器中为 window)

var name = 'name1';
console.log(name);

this.name = 'name2';
console.log(name);
console.log(this.name);

window.name = 'name3';
console.log(name);
console.log(this.name);
console.log(window.name);

JS中this上下文对象使用方式

二、函数调用

直接调用一个函数,this 默认会指向全局 (浏览器端为window)

var name = 'name1';
function sayName(){
 console.log(name);
 console.log(this);
}

sayName();
window.sayName();

可以看到

JS中this上下文对象使用方式

还有几个常见的情况,根据谁调用方法就指向谁的原则,this的指向要细看

// 全局 name
var name = 'name1';

var obj = {
 name: 'name2',
 sayName: function(){
    // 调用它的时候 this指向全局
  return function(){
   console.log(this.name);
  };
 },
 changeName: function(){
    // 调用它的时候 this指向全局
  setTimeout(function(){
   this.name = 'name3';
  },0);
 }
};

obj.sayName()();
obj.changeName();
setTimeout(function(){
 console.log(name);
 console.log(obj.name);
},0);

JS中this上下文对象使用方式

像这些类似匿名的函数,默认都是被全局(浏览器下的window)对象调用,要正确地让obj调用,就要指代好

可以用that保持this再进行下一步,或者匿名函数传值,或者使用call/apply/bind改变context等

var name = 'name1';

var obj = {
 name: 'name2',
 sayName: function(){
  var that = this;
  return function(){
   console.log(that.name);
  };
 },
 changeName: function(){
  var that = this;
  setTimeout(function(){
   that.name = 'name3';
  },0);
 }
};

obj.sayName()(); // name2
obj.changeName();
setTimeout(function(){
 console.log(name); // name1
 console.log(obj.name); // name3
},0);

三、作为对象方法的调用

其实就类似上头提到的 obj.sayName()  obj.name 等

这时this会指向这个obj 

四、call/apply/bind 的调用

当使用 Function.prototype 上的 call 或者 apply ,bind 方法时,函数内的 this将会被 显式设置为函数调用的第一个参数。

具体使用方法

我们可以稍微修改一下上头的代码,就可以看到this指向的改变

var name = 'name1';

var obj = {
 name: 'name2',
 sayName: function(){
  // 返回一个默认全局的函数
  return function(){
   console.log(this.name);
  };
 },
 changeName: function(){
  // 返回一个默认全局的函数
  setTimeout(function(){
   this.name = 'name3';
  // 然后将该函数绑定给this(当前obj对象)
  }.bind(this),0);
 }
};

// obj.sayName()这个函数,让obj来调用
obj.sayName().call(obj);
// 让this(也就是全局对象)来调用
obj.sayName().apply(this);

obj.changeName();
setTimeout(function(){
 // 输出更改之后,全局name的值
 console.log(name);
 // 输出更改之后,obj对象中 name的值
 console.log(obj.name);
},0);

JS中this上下文对象使用方式

五、作为构造函数调用

比如 new Foo();

先来看个简单的例子:

var name = 'name1';
function Foo(){
 // 赋值this(当前对象)的name属性值
 this.name = 'name2';
}

// new 构造函数产生一个实例
var foo = new Foo();

console.log(name);
console.log(foo.name);

// 直接调用该函数
Foo();
console.log(name);

JS中this上下文对象使用方式

可以看到,如果函数倾向于和 new 关键词一块使用,则我们称这个函数为构造函数,当new 了之后,this则指向这个心创建的对象(这个new 的过程其实也涉及到了继承机制)。

若直接调用这个函数,this就默认执行全局对象了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
多浏览器支持的右下角浮动窗口
Apr 01 Javascript
jQuery图片播放8款精美插件分享
Feb 17 Javascript
jQuery学习笔记之总体架构
Jun 03 Javascript
一个css与js结合的下拉菜单支持主流浏览器
Oct 08 Javascript
js数组的操作指南
Dec 28 Javascript
微信小程序 POST请求(网络请求)详解及实例代码
Nov 16 Javascript
JavaScript实现三级联动效果
Jul 15 Javascript
原生JS+Canvas实现五子棋游戏
May 28 Javascript
angularjs通过过滤器返回超链接的方法
Oct 26 Javascript
Element-UI踩坑之Pagination组件的使用
Oct 29 Javascript
JS常见内存泄漏及解决方案解析
May 30 Javascript
vue实现用户长时间不操作自动退出登录功能的实现代码
Jul 23 Javascript
JS判断来路是否是百度等搜索索引进行弹窗或自动跳转的实现代码
Oct 09 #Javascript
jQuery Ajax传值到Servlet出现乱码问题的解决方法
Oct 09 #Javascript
BootStrap中Table分页插件使用详解
Oct 09 #Javascript
微信小程序 for 循环详解
Oct 09 #Javascript
微信小程序 条件渲染详解
Oct 09 #Javascript
手机浏览器 后退按钮强制刷新页面方法总结
Oct 09 #Javascript
最实用的jQuery分页插件
Oct 09 #Javascript
You might like
ecshop 批量上传(加入自定义属性)
2012/03/20 PHP
基于magic_quotes_gpc与magic_quotes_runtime的区别与使用介绍
2013/04/22 PHP
解析PHP中的内存管理,PHP动态分配和释放内存
2013/06/28 PHP
ThinkPHP基本的增删查改操作实例教程
2014/08/22 PHP
JavaScript 克隆数组最简单的方法
2009/02/12 Javascript
setTimeout的延时为0时多个浏览器的区别
2012/05/23 Javascript
方便实用的jQuery checkbox复选框全选功能简单实例
2013/10/09 Javascript
Windows8下搭建Node.js开发环境教程
2014/09/03 Javascript
jquery mobile 移动web(5)
2015/12/20 Javascript
APP中javascript+css3实现下拉刷新效果
2016/01/27 Javascript
ECharts仪表盘实例代码(附源码下载)
2016/02/18 Javascript
JS中的hasOwnProperty()和isPrototypeOf()属性实例详解
2016/08/11 Javascript
EditPlus 正则表达式 实战(3)
2016/12/15 Javascript
js获取ip和地区
2017/03/10 Javascript
ES6学习教程之块级作用域详解
2017/10/09 Javascript
对Angular中单向数据流的深入理解
2018/03/31 Javascript
详解javascript 正则表达式之分组与前瞻匹配
2018/05/30 Javascript
关于node-bindings无法在Electron中使用的解决办法
2018/12/18 Javascript
Vue使用Canvas绘制图片、矩形、线条、文字,下载图片
2019/04/26 Javascript
layui实现左侧菜单点击右侧内容区显示
2019/07/26 Javascript
[01:00:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第三场 1月10日
2021/03/11 DOTA
详解Python的Django框架中inclusion_tag的使用
2015/07/21 Python
python监控文件或目录变化
2016/06/07 Python
python+matplotlib绘制简单的海豚(顶点和节点的操作)
2018/01/02 Python
python 异或加密字符串的实例
2018/10/14 Python
Centos7下源码安装Python3 及shell 脚本自动安装Python3的教程
2020/03/07 Python
python集合能干吗
2020/07/19 Python
中国酒类在线零售网站:酒仙网
2016/08/20 全球购物
Ticketmaster德国票务网站:购买音乐会和体育等门票
2016/11/14 全球购物
介绍信样本
2015/01/31 职场文书
高中运动会前导词
2015/07/20 职场文书
就业指导讲座心得体会
2016/01/15 职场文书
《折线统计图》教学反思
2016/02/22 职场文书
演讲稿之感恩老师(三篇范文)
2019/09/06 职场文书
PHP中国际化的字符串排序和比较对象详解
2021/08/23 PHP
企业开发CSS命名BEM代码规范实践
2022/02/12 HTML / CSS