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 相关文章推荐
让textarea控件的滚动条怎是位与最下方
Apr 20 Javascript
javascript来定义类的规范小结
Nov 19 Javascript
JavaScript中清空数组的三种方法分享
Apr 07 Javascript
javascript定义变量时带var与不带var的区别分析
Jan 12 Javascript
jQuery遍历json中多个map的方法
Feb 12 Javascript
JavaScript通过this变量快速找出用户选中radio按钮的方法
Mar 23 Javascript
JS实现仿Windows7风格的网页右键菜单效果代码
Sep 11 Javascript
jQuery查找和过滤_动力节点节点Java学院整理
Jul 04 jQuery
JS如何设置元素样式的方法示例
Aug 28 Javascript
vue2.0 父组件给子组件传递数据的方法
Jan 15 Javascript
详解JavaScript原生封装ajax请求和Jquery中的ajax请求
Feb 14 jQuery
jquery实现上传图片功能
Jun 29 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制作静态网站的模板框架(二)
2006/10/09 PHP
ADODB结合SMARTY使用~超级强
2006/11/25 PHP
探讨:如何编写PHP扩展
2013/06/13 PHP
PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】
2017/10/07 PHP
Prototype使用指南之enumerable.js
2007/01/10 Javascript
SOSO地图JS画出标注和中心点以html形式运行
2013/08/09 Javascript
javascript中简单的进制转换代码实例
2013/10/26 Javascript
jQuery中mouseover事件用法实例
2014/12/26 Javascript
招聘网站基于jQuery实现自动刷新简历
2015/05/10 Javascript
javascript实现五星评价代码(源码下载)
2015/08/11 Javascript
jQuery实现带动画效果的多级下拉菜单代码
2015/09/08 Javascript
自己动手制作基于jQuery的Web页面加载进度条插件
2016/06/03 Javascript
好好了解一下Cookie(强烈推荐)
2016/06/14 Javascript
jQuery实现带延时功能的水平多级菜单效果【附demo源码下载】
2016/09/21 Javascript
Seajs是什么及sea.js 由来,特点以及优势
2016/10/13 Javascript
Angular X中使用ngrx的方法详解(附源码)
2017/07/10 Javascript
VUE渲染后端返回含有script标签的html字符串示例
2019/10/28 Javascript
视觉直观感受若干常用排序算法
2017/04/13 Python
python实现搜索文本文件内容脚本
2018/06/22 Python
python 将列表中的字符串连接成一个长路径的方法
2018/10/23 Python
Python实现的爬取豆瓣电影信息功能案例
2019/09/15 Python
Python基于class()实现面向对象原理详解
2020/03/26 Python
python中元组的用法整理
2020/06/15 Python
如何在python中判断变量的类型
2020/07/29 Python
HTML5+Canvas+CSS3实现齐天大圣孙悟空腾云驾雾效果
2016/04/26 HTML / CSS
利物浦足球俱乐部官方商店(美国):Liverpool FC US
2019/10/09 全球购物
描述JSP和Servlet的区别、共同点、各自应用的范围
2012/10/02 面试题
我的网上商城创业计划书
2013/12/26 职场文书
中青班党性分析材料
2014/02/16 职场文书
幼儿园园长工作总结2015
2015/05/25 职场文书
千手观音观后感
2015/06/03 职场文书
护士年终工作总结不会写?各科护士模板总结
2020/01/02 职场文书
iPhone13再次曝光
2021/04/15 数码科技
Python中文分词库jieba(结巴分词)详细使用介绍
2022/04/07 Python
PostgreSQL逻辑复制解密原理解析
2022/09/23 PostgreSQL
解决ubuntu安装软件时,status-code=409报错的问题
2022/12/24 Servers