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 相关文章推荐
用window.location.href实现刷新另个框架页面
Mar 07 Javascript
jquery的ajax从纯真网(cz88.net)获取IP地址对应地区名
Dec 02 Javascript
拖动布局之保存布局页面cookies篇
Oct 29 Javascript
关于 文本框默认值 的操作js代码
Jan 12 Javascript
js用Date对象的setDate()函数对日期进行加减操作
Sep 18 Javascript
JS实现登录页面记住密码和enter键登录方法推荐
May 10 Javascript
ES6中的箭头函数实例详解
Apr 06 Javascript
angular2路由之routerLinkActive指令【推荐】
May 30 Javascript
JavaScript函数IIFE使用详解
Oct 21 Javascript
vue 中的 render 函数作用详解
Feb 28 Javascript
基于JavaScript获取url参数2种方法
Apr 17 Javascript
JavaScript实现九宫格拖拽效果
Jun 28 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 session_start()关于Cannot send session cache limiter - headers already sent错误解决方法
2009/11/27 PHP
PHP最常用的ini函数分析 针对PHP.ini配置文件
2010/04/22 PHP
PHP模块 Memcached功能多于Memcache
2011/06/14 PHP
PHP5.5在windows安装使用memcached服务端的方法
2014/04/16 PHP
destoon找回管理员密码的方法
2014/06/21 PHP
php实现Linux服务器木马排查及加固功能
2014/12/29 PHP
php实现字符串首字母大写和单词首字母大写的方法
2015/03/14 PHP
PHP基于正则批量替换Img中src内容实现获取缩略图的功能示例
2017/06/07 PHP
PHP设计模式之策略模式原理与用法实例分析
2019/04/04 PHP
js版本A*寻路算法
2006/12/22 Javascript
innerhtml用法 innertext用法 以及innerHTML与innertext的区别
2009/10/26 Javascript
ExtJs中简单的登录界面制作方法
2010/08/19 Javascript
node.js下when.js 的异步编程实践
2014/12/03 Javascript
nodejs简单实现中英文翻译
2015/05/04 NodeJs
jQuery实现复选框批量选择与反选的方法
2015/06/17 Javascript
js无法获取到html标签的属性的解决方法
2016/07/26 Javascript
JS当前页面登录注册框,固定DIV,底层阴影的实例代码
2016/09/29 Javascript
浅谈javascript中的事件冒泡和事件捕获
2016/12/28 Javascript
JavaScript中利用Array filter() 方法压缩稀疏数组
2018/02/24 Javascript
JavaScript面试出现频繁的一些易错点整理
2018/03/29 Javascript
[01:13:08]2018DOTA2亚洲邀请赛4.6 淘汰赛 mineski vs LGD 第二场
2018/04/10 DOTA
python中字典dict常用操作方法实例总结
2015/04/04 Python
python利用Guetzli批量压缩图片
2017/03/23 Python
Python变量赋值的秘密分享
2018/04/03 Python
python抽取指定url页面的title方法
2018/05/11 Python
解决pycharm中opencv-python导入cv2后无法自动补全的问题(不用作任何文件上的修改)
2020/03/05 Python
Django更新models数据库结构步骤
2020/04/01 Python
PyCharm安装PyQt5及其工具(Qt Designer、PyUIC、PyRcc)的步骤详解
2020/11/02 Python
很酷的小工具和电子产品商城:GearBest
2016/11/19 全球购物
香港百佳网上超级市场:PARKNSHOP.com
2020/06/10 全球购物
最受欢迎的自我评价
2013/12/22 职场文书
教师网络培训感言
2014/03/09 职场文书
幼儿园亲子活动总结
2014/04/26 职场文书
习近平在党的群众路线教育实践活动总结大会上的讲话
2014/10/21 职场文书
前台接待岗位职责
2015/02/03 职场文书
增值税发票丢失证明
2015/06/19 职场文书