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 相关文章推荐
线路分流自动跳转代码;希望对大家有用!
Dec 02 Javascript
Javascript之文件操作
Mar 07 Javascript
jquery 动态创建元素的方式介绍及应用
Apr 21 Javascript
js toFixed()方法的重写实现精度的统一
Mar 06 Javascript
Javascript核心读书有感之类型、值和变量
Feb 11 Javascript
jQuery的position()方法详解
Jul 19 Javascript
js脚本分页代码分享(7种样式)
Aug 19 Javascript
JavaScript学习笔记之检测客户端类型是(引擎、浏览器、平台、操作系统、移动设备)
Dec 03 Javascript
基于JS实现新闻列表无缝向上滚动实例代码
Jan 22 Javascript
javascript实现简单的可随机变色网页计算器示例
Dec 30 Javascript
JavaScript查看代码运行效率console.time()与console.timeEnd()用法
Jan 18 Javascript
TypeScript中的方法重载详解
Apr 12 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使用GIFEncoder类处理gif图片实例
2014/07/01 PHP
php利用fsockopen GET/POST提交表单及上传文件
2017/05/22 PHP
PHP使用ActiveMQ实现消息队列的方法详解
2019/05/31 PHP
laravel 查询数据库获取结果实现判断是否为空
2019/10/24 PHP
Use Word to Search for Files
2007/06/15 Javascript
javascript cookies操作集合
2010/04/12 Javascript
js 兼容多浏览器的回车和鼠标焦点事件代码(IE6/7/8,firefox,chrome)
2010/04/14 Javascript
js自动生成对象的属性示例代码
2013/10/28 Javascript
JavaScript检查子字符串是否在字符串中的方法
2016/02/03 Javascript
JS判断输入字符串长度实例代码(汉字算两个字符,字母数字算一个)
2016/08/02 Javascript
正则表达式,替换所有HTML标签的简单实例
2016/11/28 Javascript
利用Vue.js+Node.js+MongoDB实现一个博客系统(附源码)
2017/04/24 Javascript
Vue的Class与Style绑定的方法
2017/09/01 Javascript
Vue中对iframe实现keep alive无刷新的方法
2019/07/23 Javascript
微信小程序—setTimeOut定时器的问题及解决
2019/07/26 Javascript
微信小程序实现搜索框功能及踩过的坑
2020/06/19 Javascript
python查看微信好友是否删除自己
2016/12/19 Python
Python 安装setuptools和pip工具操作方法(必看)
2017/05/22 Python
python3.4用函数操作mysql5.7数据库
2017/06/23 Python
python flask 多对多表查询功能
2017/06/25 Python
python2.7+selenium2实现淘宝滑块自动认证功能
2018/02/24 Python
详解python多线程、锁、event事件机制的简单使用
2018/04/27 Python
使用11行Python代码盗取了室友的U盘内容
2018/10/23 Python
快速排序的四种python实现(推荐)
2019/04/03 Python
Python面向对象程序设计之私有属性及私有方法示例
2019/04/08 Python
Python从入门到精通之环境搭建教程图解
2019/09/26 Python
Jupyter notebook如何修改平台字体
2020/05/13 Python
荷兰的时尚市场:To Be Dressed
2019/05/06 全球购物
德国户外商店:eXXpozed
2020/07/25 全球购物
linux比较文件内容的命令是什么
2013/03/04 面试题
见习期个人总结
2015/03/05 职场文书
人事行政助理岗位职责
2015/04/11 职场文书
2015年反洗钱工作总结
2015/04/25 职场文书
nginx实现发布静态资源的方法
2021/03/31 Servers
CSS的calc函数用法小结
2022/06/25 HTML / CSS
Win11远程连接不上怎么办?Win11远程桌面用不了的解决方法
2022/08/05 数码科技