JavaScript this指向相关原理及实例解析


Posted in Javascript onJuly 10, 2020

记得初学 JavaScript 时,其中 this 的指向问题曾让我头疼不已,我还曾私自将其与闭包、原型(原型链)并称 JS 武林中的三大魔头。如果你要想在 JS 武林中称霸一方,必须将这三大魔头击倒。个人认为在这三大魔头中,this 指向问题的武功最菜(难度最低)。俗话说柿子捡软的捏,那我们就先从 this 指向问题下手。

先记住攻克 this 指向问题的口诀(前辈们的总结):哪个对象调用函数,函数里的 this 就默认指向哪个对象(注意 this 只能指向对象)。这里说“默认指向”是因为我们通过箭头函数、call、apply、bind等手段来改变 this 的指向。现在我们只讨论 this 的默认指向。

全局作用域下以及全局作用域的函数中,this默认指向全局对象window

在严格模式下,全局作用域的函数中,this默认指向 undefined, 这是严格模式所规定的。

// 非严格模式下
console.log(this); // Window
function doSomething(){
  console.log(this); // Window
}
doSomething(); // 这里可以看成window.doSomething(),所以函数里的this指向全局对象window
// 严格模式下
'use strict';
console.log(this); // Window
function doInStrict(){
  console.log(this); // undefined
}
doInStrict();

对象里的函数,this指向该对象

var a = 1;
var obj = {
  a: 2,
  fn: function(){
    console.log(this); // {a: 2, fn: ƒ}
    console.log(this.a); // 2
  }
};
obj.fn();

上面函数被调用后,从打印结果可以看出此时 this 指向的是调用函数的对象 obj。如果将对象中的函数赋给全局对象中定义的变量 fn1,执行 fn1 又会出现什么结果呢?

var a = 1;
var obj = {
  a: 2,
  fn: function(){
    console.log(this); // Winidow
    console.log(this.a); // 1
  }
};
var fn1 = obj.fn;
fn1(); // 可以看成window.fn1();

从上面的例子可以看出,fn1 与 obj.fn 指向的函数是相同的,但是调用它的对象不同,那么函数中 this 的指向也就不一样了。

再看一个比较复杂的例子:

var a = 0;
function fn(){
	consoloe.log(this.a);
}
var obj1 = {
	a: 1,
	fn: function(){
		console.log(this.a);
	}
};
var obj2 = {
	a: 2,
	fn: function(){
		fn();
		obj1.fn();
		console.log(this.a);
	}
}
obj2.fn();

先说下执行结果,分别打印 0 1 2。当 obj2 调用 fn 函数时,先执行的是 fn(),这个函数是在全局作用域中定义的,该调用可以看成 window.fn(),所以,该函数内部的 this 指向的是 window 全局对象,this.a 自然就是全局对象中的 a 值(0)。

接着执行的是 obj1.fn(),它会从 obj1 中找到 fn 函数并执行。obj1 中的函数 fn 执行时调用它的对象是 obj1,所以,此时函数内部的 this 指向的就是 obj1 自身。那么 this.a 查到的值也就是对象 obj1 中 a 的值(1)。

最后打印函数中 this 所处的函数 fn 是被 obj2 调用的,那么自然而然 this 就指向了 obj2,所以 this.a 的结果就是 2 了。

从上面这个例子我们可以看出:函数内部 this 指向跟调用函数的对象有关,跟函数在哪里调用没有关系。

Window内置函数的回调函数中,this指向Window对象。
window 的内置函数( setInterval setTimeout 等),其回调函数中的 this 指向的是window对象。

var name = 'window';
var obj = {
  name: 'obj',
  func: function(){
    setTimeout(function () {
      console.log(this.name) // window
    },1000)
  }
}

obj.func()

但是一般在开发中,很多场景都需要改变 this 的指向。 后面我会专门写一篇关于更改 this 指向的文章,这里就不再赘述了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery 简单导航实现代码
Sep 11 Javascript
使用node.js半年来总结的 10 条经验
Aug 18 Javascript
浅谈Jquery核心函数
Jun 18 Javascript
js实现带有介绍的Select列表菜单实例
Aug 18 Javascript
ionic在开发ios系统微信时键盘挡住输入框的解决方法(键盘弹出问题)
Sep 06 Javascript
js实现可旋转的立方体模型
Oct 16 Javascript
less简单入门(CSS 预处理语言)
Mar 08 Javascript
Bootstrap笔记—折叠实例代码
Mar 13 Javascript
Vue插件打包与发布的方法示例
Aug 20 Javascript
vue实现侧边栏导航效果
Oct 21 Javascript
Electron整合React使用搭建开发环境的步骤详解
Jun 07 Javascript
用JS实现飞机大战小游戏
Jun 09 Javascript
JavaScript indexOf()原理及使用方法详解
Jul 09 #Javascript
如何在postman测试用例中实现断言过程解析
Jul 09 #Javascript
解决qrcode.js生成二维码时必须定义一个空div的问题
Jul 09 #Javascript
Electron 打包问题:electron-builder 下载各种依赖出错(推荐)
Jul 09 #Javascript
jQuery实现B2B网站后台管理系统侧导航
Jul 08 #jQuery
ssm+vue前后端分离框架整合实现(附源码)
Jul 08 #Javascript
Vue作用域插槽实现方法及作用详解
Jul 08 #Javascript
You might like
PHP+AJAX实现无刷新注册(带用户名实时检测)
2006/12/02 PHP
PHP登录验证码的实现与使用方法
2016/07/07 PHP
thinkphp 抓取网站的内容并且保存到本地的实例详解
2017/08/25 PHP
Windows平台PHP+IECapt实现网页批量截图并创建缩略图功能详解
2019/08/02 PHP
Laravel 实现Controller向blade前台模板赋值的四种方式小结
2019/10/22 PHP
[HTML/CSS/Javascript]WWTJS
2007/09/25 Javascript
jquery解决图片路径不存在执行替换路径
2013/02/06 Javascript
js 利用image对象实现图片的预加载提高访问速度
2013/03/29 Javascript
JS简单的轮播的图片滚动实例
2013/06/17 Javascript
原生javascript实现的一个简单动画效果
2016/03/30 Javascript
利用浮层使select不可选的实现方法
2016/12/03 Javascript
Bootstrap实现圆角、圆形头像和响应式图片
2016/12/14 Javascript
jQuery实现简单漂亮的Nav导航菜单效果
2017/03/29 jQuery
基于jQuery的左滑出现删除按钮的示例
2017/08/29 jQuery
js实现一个简单的MVVM框架示例
2018/01/15 Javascript
JS实现为动态创建的元素添加事件操作示例
2018/03/17 Javascript
Egg.js 中 AJax 上传文件获取参数的方法
2018/10/10 Javascript
Vue组件通信的几种实现方法
2019/04/25 Javascript
微信小程序开发之点击按钮退出小程序的实现方法
2019/04/26 Javascript
js函数柯里化的方法和作用实例分析
2020/04/11 Javascript
python文件操作整理汇总
2014/10/21 Python
深入解析Python编程中JSON模块的使用
2015/10/15 Python
详解python中sort排序使用
2019/03/23 Python
python tkinter实现屏保程序
2019/07/30 Python
pyenv虚拟环境管理python多版本和软件库的方法
2019/12/26 Python
如何在windows下安装配置python工具Ulipad
2020/10/27 Python
HTML5 对各个标签的定义与规定:body的介绍
2012/06/21 HTML / CSS
Speedo美国:澳大利亚顶尖泳衣制造商
2016/08/03 全球购物
Aurora London官网:奢华、负担得起的皮革手袋
2020/08/01 全球购物
班组长的岗位职责
2013/12/09 职场文书
开办大学饮食联盟创业计划书
2014/01/29 职场文书
会计的岗位职责
2014/03/15 职场文书
美食节目策划方案
2014/05/31 职场文书
公务员党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
关于html选择框创建占位符的问题
2021/06/09 HTML / CSS
「SHOW BY ROCK!!」“雫シークレットマインド”组合单曲MV公开
2022/03/21 日漫