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批量设置属性readonly和disabled的方法
Jan 24 Javascript
jQuery 回车事件enter使用示例
Feb 18 Javascript
推荐8款jQuery轻量级树形Tree插件
Nov 12 Javascript
node.js中的url.format方法使用说明
Dec 10 Javascript
不使用ajax实现无刷新提交表单
Dec 21 Javascript
JavaScript中的bold()方法使用详解
Jun 08 Javascript
JavaScript九九乘法口诀表的简单实现
Oct 04 Javascript
js转换对象为xml
Feb 17 Javascript
layui表格实现代码
May 20 Javascript
Vue 第三方字体图标引入 Font Awesome的方法
Sep 28 Javascript
vue-test-utils初使用详解
May 23 Javascript
jQuery实现的解析本地 XML 文档操作示例
Apr 30 jQuery
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
咖啡的传说和历史
2021/03/03 新手入门
浅谈Windows下 PHP4.0与oracle 8的连接设置
2006/10/09 PHP
PHP mysql与mysqli事务使用说明 分享
2013/08/17 PHP
php读取mssql的ntext字段返回值为空的解决方法
2014/12/30 PHP
十大使用PHP框架的理由
2015/09/26 PHP
php开发时容易忘记的一些技术细节
2016/02/03 PHP
PHP 无限级分类
2017/05/04 PHP
如何利用PHP实现上传图片功能详解
2020/09/24 PHP
动态添加js事件实现代码
2009/03/12 Javascript
javascript中length属性的探索
2011/07/31 Javascript
js中function()使用方法
2013/12/24 Javascript
javascript页面加载完执行事件代码
2014/02/11 Javascript
jquery实现submit提交表单
2015/02/03 Javascript
如何编写高质量JS代码(续)
2015/02/25 Javascript
jQuery 遍历函数详解
2015/07/05 Javascript
jquery自动补齐功能插件flexselect用法示例
2016/08/06 Javascript
Bootstrap基本组件学习笔记之列表组(11)
2016/12/07 Javascript
关于页面刷新vuex数据消失问题解决方案
2017/07/03 Javascript
js将当前时间格式化为 年-月-日 时:分:秒的实现代码
2018/01/20 Javascript
使用kbone解决Vue项目同时支持小程序问题
2019/11/08 Javascript
Django视图之ORM数据库查询操作API的实例
2017/10/27 Python
python实现神经网络感知器算法
2017/12/20 Python
Python中正则表达式的用法总结
2019/02/22 Python
python+selenium实现自动化百度搜索关键词
2019/06/03 Python
python统计mysql数据量变化并调用接口告警的示例代码
2020/09/21 Python
用css3写出气球样式的示例代码
2017/09/11 HTML / CSS
Shopee印度尼西亚:东南亚与台湾市场最大电商平台
2018/06/17 全球购物
乐高西班牙官方商店:LEGO Shop ES
2019/12/01 全球购物
Ajxa常见问题都有哪些
2014/03/26 面试题
教师业务学习材料
2014/12/16 职场文书
教师求职自荐信
2015/03/26 职场文书
2015年学校办公室工作总结
2015/05/26 职场文书
html+css合并表格边框的示例代码
2021/03/31 HTML / CSS
zabbix自定义监控nginx状态实现过程
2021/11/01 Servers
SpringBoot中使用Redis作为全局锁示例过程
2022/03/24 Java/Android
OpenFeign实现远程调用
2022/08/14 Java/Android