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 相关文章推荐
超清晰的document对象详解
Feb 27 Javascript
js 可拖动列表实现代码
Dec 13 Javascript
浅析四种常见的Javascript声明循环变量的书写方式
Oct 14 Javascript
浅谈node.js中async异步编程
Oct 22 Javascript
element-ui 的el-button组件中添加自定义颜色和图标的实现方法
Oct 26 Javascript
express启用https使用小记
May 21 Javascript
实现vuex与组件data之间的数据同步更新方式
Nov 12 Javascript
jQuery实现验证用户登录
Dec 10 jQuery
Vue 实现分页与输入框关键字筛选功能
Jan 02 Javascript
Vue项目移动端滚动穿透问题的实现
May 19 Javascript
Vue使用自定义指令实现拖拽行为实例分析
Jun 06 Javascript
jQuery ajax - getScript() 方法和getJSON方法
May 14 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
在PHP中使用反射技术的架构插件使用说明
2010/05/18 PHP
PHP 使用MySQL管理Session的回调函数详解
2013/06/21 PHP
PHP数据库表操作的封装类及用法实例详解
2016/07/12 PHP
PHP下的浮点运算不准的解决方法
2016/10/27 PHP
Zend Framework处理Json数据方法详解
2016/12/09 PHP
微信公众平台开发教程⑥ 微信开发集成类的使用图文详解
2019/04/10 PHP
PHP网页缓存技术优点及代码实例
2020/07/29 PHP
toString()一个会自动调用的方法
2010/02/08 Javascript
关于jQuery对象数据缓存Cache原理以及jQuery.data详解
2013/04/07 Javascript
js子页面获取父页面数据示例
2014/05/15 Javascript
判断浏览器的内核及版本号方法汇总
2015/01/05 Javascript
yui3的AOP(面向切面编程)和OOP(面向对象编程)
2015/05/01 Javascript
使用Object.defineProperty实现简单的js双向绑定
2016/04/15 Javascript
谈谈JavaScript的New关键字
2016/08/26 Javascript
js简单正则验证汉字英文及下划线的方法
2016/11/28 Javascript
BootStrap轮播HTML代码(推荐)
2016/12/10 Javascript
详解JS对象封装的常用方式
2016/12/30 Javascript
react redux入门示例
2018/04/19 Javascript
Vue实现点击时间获取时间段查询功能
2020/08/21 Javascript
vue-quill-editor+plupload富文本编辑器实例详解
2018/10/19 Javascript
实用Javascript调试技巧分享(小结)
2019/06/18 Javascript
vue实现图片上传预览功能
2019/12/23 Javascript
vue + el-form 实现的多层循环表单验证
2020/11/25 Vue.js
python中循环语句while用法实例
2015/05/16 Python
酷! 程序员用Python带你玩转冲顶大会
2018/01/17 Python
PyQt+socket实现远程操作服务器的方法示例
2019/08/22 Python
Python importlib模块重载使用方法详解
2020/10/13 Python
纯HTML+CSS3制作导航菜单(附源码)
2013/04/24 HTML / CSS
乐天旅游台湾网站:Rakuten Travel TW
2017/06/01 全球购物
企划经理的岗位职责
2013/11/17 职场文书
办公室岗位职责
2014/02/12 职场文书
涉外离婚协议书怎么写
2014/11/20 职场文书
优秀乡村医生事迹材料(2016精选版)
2016/02/29 职场文书
使用GO语言实现Mysql数据库CURD的简单示例
2021/08/07 Golang
一文带你探究MySQL中的NULL
2021/11/11 MySQL
Go语言特点及基本数据类型使用详解
2022/03/21 Golang