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 函数式编程
Aug 16 Javascript
JavaScript使用过程中需要注意的地方和一些基本语法
Aug 26 Javascript
jQuery 源码分析笔记(5) jQuery.support
Jun 19 Javascript
jquery背景跟随鼠标滑动导航
Nov 20 Javascript
Javascript打印局部页面实例
Jun 21 Javascript
基于jPlayer三分屏的制作方法
Dec 21 Javascript
微信小程序 chooseImage选择图片或者拍照
Apr 07 Javascript
微信小程序之获取当前位置经纬度以及地图显示详解
May 09 Javascript
WebStorm ES6 语法支持设置&babel使用及自动编译(详解)
Sep 08 Javascript
jQuery动态移除与增加onclick属性的方法详解
Jun 07 jQuery
JS前端知识点总结之页面加载事件,数组操作,DOM节点操作,循环和分支
Jul 04 Javascript
js实现碰撞检测
Jan 29 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编码转换
2012/11/05 PHP
PHP防止post重复提交数据的简单例子
2014/06/07 PHP
Thinkphp中volist标签mod控制一定记录的换行BUG解决方法
2014/11/04 PHP
PHP获取ttf格式文件字体名的方法示例
2019/03/06 PHP
js字符编码函数区别分析
2008/06/05 Javascript
Javascript 原型和继承(Prototypes and Inheritance)
2009/04/01 Javascript
jQuery 跨域访问问题解决方法
2009/12/02 Javascript
让浏览器非阻塞加载javascript的几种方法小结
2011/04/25 Javascript
showModelDialog弹出文件下载窗口的使用示例
2013/11/19 Javascript
Javascript玩转继承(三)
2014/05/08 Javascript
JavaScript利用append添加元素报错的解决方法
2014/07/01 Javascript
理解javascript正则表达式
2016/03/08 Javascript
基于JavaScript实现鼠标向下滑动加载div的代码
2016/08/31 Javascript
常用的几个JQuery代码片段
2017/03/13 Javascript
详解Angular操作cookies方法
2018/06/01 Javascript
解决vuex刷新状态初始化的方法实现
2019/08/15 Javascript
小程序采集录音并上传到后台
2019/11/22 Javascript
[06:16]第十四期-国士无双绝地翻盘之撼地神牛
2014/06/24 DOTA
[44:40]Spirit vs Navi Supermajor小组赛 A组败者组第一轮 BO3 第一场 6.2
2018/06/03 DOTA
Python 时间操作例子和时间格式化参数小结
2014/04/24 Python
以windows service方式运行Python程序的方法
2015/06/03 Python
浅谈Python中的可迭代对象、迭代器、For循环工作机制、生成器
2019/03/11 Python
python不同系统中打开方法
2020/06/23 Python
Under Armour安德玛法国官网:美国高端运动科技品牌
2018/06/29 全球购物
英国排名第一的餐具品牌:Denby Pottery
2019/11/01 全球购物
Traffic People官网:女式花裙、上衣和连身裤
2020/10/12 全球购物
戴森比利时官方网站:Dyson BE
2020/10/03 全球购物
社区关爱留守儿童活动方案
2014/08/22 职场文书
2014年售票员工作总结
2014/11/19 职场文书
2014小学语文教学工作总结
2014/12/17 职场文书
2015年党风廉政建设工作总结
2015/04/09 职场文书
《蓝鲸的眼睛》读后感5篇
2020/01/15 职场文书
php 防护xss,PHP的防御XSS注入的终极解决方案
2021/04/01 PHP
浅谈Python数学建模之固定费用问题
2021/06/23 Python
js作用域及作用域链工作引擎
2022/07/07 Javascript