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 相关文章推荐
javascript 在网页中的运用(asp.net)
Nov 23 Javascript
js操作iframe的一些方法介绍
Jun 25 Javascript
20行代码实现的一个CSS覆盖率测试脚本
Jul 07 Javascript
利用函数的惰性载入提高javascript代码执行效率
May 05 Javascript
基于jQuery实现的图片切换焦点图整理
Dec 07 Javascript
js replace(a,b)之替换字符串中所有指定字符的方法
Aug 17 Javascript
基于jQuery使用Ajax动态执行模糊查询功能
Jul 05 jQuery
node之本地服务器图片上传的方法示例
Mar 26 Javascript
vue仿ios列表左划删除
Sep 26 Javascript
微信小程序激励式视频广告组件使用详解
Dec 06 Javascript
vue使用vant中的checkbox实现全选功能
Nov 17 Vue.js
关于对TypeScript泛型参数的默认值理解
Jul 15 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下网站防IP攻击代码,超级实用
2010/10/24 PHP
smarty模板中使用get、post、request、cookies、session变量的方法
2014/04/24 PHP
php微信公众开发之获取周边酒店信息的方法
2014/12/22 PHP
php5.4以上版本GBK编码下htmlspecialchars输出为空问题解决方法汇总
2015/04/03 PHP
微信公众平台开发之天气预报功能
2015/08/31 PHP
PHP模板引擎Smarty内建函数详解
2016/04/11 PHP
PHP 5.6.11 访问SQL Server2008R2的几种情况详解
2016/08/08 PHP
php实现JWT验证的实例教程
2020/11/26 PHP
javascript 写类方式之七
2009/07/05 Javascript
JQuery 学习笔记 选择器之一
2009/07/23 Javascript
jQuery图片轮播的具体实现
2013/09/11 Javascript
jquery获得keycode的示例代码
2013/12/30 Javascript
当前流行的JavaScript代码风格指南
2014/09/10 Javascript
20个实用的JavaScript技巧分享
2014/11/28 Javascript
20条学习javascript的编程规范的建议
2014/11/28 Javascript
js实现漂浮回顶部按钮实例
2015/05/06 Javascript
js实现非常简单的焦点图切换特效实例
2015/05/07 Javascript
chrome浏览器如何断点调试异步加载的JS
2016/09/05 Javascript
浅谈Vue.js 1.x 和 2.x 实例的生命周期
2017/07/25 Javascript
原生js实现简单的模态框示例
2017/09/08 Javascript
解决layui中table异步数据请求不支持自定义返回数据格式的问题
2018/08/19 Javascript
vue移动端屏幕适配详解
2019/04/30 Javascript
JS script脚本中async和defer区别详解
2020/06/24 Javascript
Vue 列表页带参数进详情页的操作(router-link)
2020/11/13 Javascript
python读取二进制mnist实例详解
2017/05/31 Python
利用python打印出菱形、三角形以及矩形的方法实例
2017/08/08 Python
python爬取网页转换为PDF文件
2018/06/07 Python
django ManyToManyField多对多关系的实例详解
2019/08/09 Python
python实现简易淘宝购物
2019/11/22 Python
TensorFlow使用Graph的基本操作的实现
2020/04/22 Python
用python计算文件的MD5值
2020/12/23 Python
Pytorch自定义Dataset和DataLoader去除不存在和空数据的操作
2021/03/03 Python
离职保密承诺书
2014/05/28 职场文书
大学军训心得体会800字
2016/01/11 职场文书
go 原生http web 服务跨域restful api的写法介绍
2021/04/27 Golang
vue实现可拖拽的dialog弹框
2021/05/13 Vue.js