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 相关文章推荐
jQuery对象和DOM对象的相互转化实现代码
Mar 02 Javascript
jquery 学习笔记一
Apr 07 Javascript
jQuery实现的类flash菜单效果代码
May 17 Javascript
原生js ActiveXObject获取execl里面的值
Nov 01 Javascript
JavaScript数据库TaffyDB用法实例分析
Jul 27 Javascript
js实现String.Fomat的实例代码
Sep 02 Javascript
vue.js 表格分页ajax 异步加载数据
Oct 18 Javascript
Ubuntu 16.04 64位中搭建Node.js开发环境教程
Oct 19 Javascript
react实现pure render时bind(this)隐患需注意!
Mar 09 Javascript
基于react框架使用的一些细节要点的思考
May 31 Javascript
详解如何在webpack中做预渲染降低首屏空白时间
Aug 22 Javascript
原生JS实现前端本地文件上传
Sep 08 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
PHP面向对象之旅:深入理解static变量与方法
2014/01/06 PHP
ThinkPHP3.1新特性之对Ajax的支持更加完善
2014/06/19 PHP
php操作xml并将其插入数据库的实现方法
2016/09/08 PHP
PHP实现批量重命名某个文件夹下所有文件的方法
2017/09/04 PHP
PHP PDO数据库操作预处理与注意事项
2019/03/16 PHP
PHP实现二维数组按照指定的字段进行排序算法示例
2019/04/23 PHP
JSON 学习之完全手册 图文
2007/05/29 Javascript
json格式的时间显示为正常年月日的方法
2013/09/08 Javascript
jquery实现html页面 div 假分页有原理有代码
2014/09/06 Javascript
JavaScript实现数字数组按照倒序排列的方法
2015/04/06 Javascript
理解JS绑定事件
2016/01/19 Javascript
jQuery实现定位滚动条位置
2016/08/05 Javascript
ES6学习之变量的解构赋值
2017/02/12 Javascript
webpack踩坑之路图片的路径与打包
2017/09/05 Javascript
cordova入门基础教程及使用中遇到的一些问题总结
2017/11/14 Javascript
vue2.0获取鼠标位置的方法
2018/09/13 Javascript
JS简单判断是否在微信浏览器打开的方法示例
2019/01/08 Javascript
JS实现鼠标按下拖拽效果
2020/07/23 Javascript
Vue3+elementui plus创建项目的方法
2020/12/01 Vue.js
python使用新浪微博api上传图片到微博示例
2014/01/10 Python
深入解析Python中的线程同步方法
2016/06/14 Python
Python基于多线程实现抓取数据存入数据库的方法
2018/06/22 Python
关于python列表增加元素的三种操作方法
2018/08/22 Python
Python数据可视化之画图
2019/01/15 Python
python标记语句块使用方法总结
2019/08/05 Python
Django框架请求生命周期实现原理
2020/11/13 Python
matplotlib bar()实现多组数据并列柱状图通用简便创建方法
2021/02/24 Python
HTML5新标签兼容——> 的两种方法
2018/09/12 HTML / CSS
凯特王妃父母建立的派对用品网站:Party Pieces
2017/05/28 全球购物
南京某公司笔试题
2013/01/27 面试题
元旦活动感言
2014/03/08 职场文书
2014年党支部承诺书
2014/05/30 职场文书
公安交警个人对照检查材料思想汇报
2014/10/01 职场文书
大班下学期幼儿评语
2014/12/30 职场文书
2015年幼儿园安全工作总结
2015/05/12 职场文书
MySQL悲观锁与乐观锁的实现方案
2021/11/02 MySQL