JavaScript中this函数使用实例解析


Posted in Javascript onFebruary 21, 2020

这篇文章主要介绍了JavaScript中this函数使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

普通函数

普通函数中的this,普通函数中的this表示调用此函数时的对象,如下例:

var x=11;
var obj={
 x:22,
 say:function(){
 console.log(this.x)
 }
}
obj.say();
//console.log输出的是22
//调用say函数的是对象obj,所以this指代对象obj,输出的就是obj对象里的x值,即22。

箭头函数

箭头函数中的this,资料上说的箭头函数内部是没有this的,也就是说,箭头函数里面的this会继承自外部的this,下面有个例子,用来详细说明下:

var x=11;
var obj={
 x:22,
 y:this,//window
 say:()=>{
 console.log(this.x);
 }
}
obj.say();
//输出的值为11
console.log(obj.y);
//输出的值为window对象
//obj对象中的this指代的就是window,也就是全局环境,因为箭头函数中的this就会就近找到上一个对象中this所指代的对象,从以上例子可以看出来,obj内部属性y就为obj内部this指代的对象,输出是window。

由于箭头函数不绑定this, 它会捕获其所在(即定义的位置)上下文的this值, 作为自己的this值,

1、所以 call() / apply() / bind() 方法对于箭头函数来说只是传入参数,对它的 this 毫无影响。

2、考虑到 this 是词法层面上的,严格模式中与 this 相关的规则都将被忽略。(可以忽略是否在严格模式下的影响)

因为箭头函数可以捕获其所在上下文的this值 所以

function Person() { 
 this.age = 0; 
 setInterval(() => {
 // 回调里面的 `this` 变量就指向了期望的那个对象了
 this.age++;
 }, 3000);
}

var p = new Person();

两个例子加深印象

普通函数

var a=11
function test1(){
 this.a=22;
 let b=function(){
 console.log(this.a);
 };
 b();
}
var x=new test1();
//输出11

为什么会输出11?因为普通函数中的this指向的是调用它的对象,如果没有直接调用对象,会指向undefined或者window,一般都会指向window,在严格模式下才会指向undefined。上述的例子中,并没有明确的调用对象,而普通函数中的this并不会向上继续找对象,所以直接返回window。

箭头函数

var a=11;
function test2(){
 this.a=22;
 let b=()=>{console.log(this.a)}
 b();
}
var x=new test2();
//输出22

箭头函数中会往上寻找this,直到找到所代表的this为止。例子中,构造函数被实例化成为一个对象x,那x中的this指代的就是对象x本身,所以箭头函数this就代表x对象,x对象内部的a值为22,所以输出22。

总结

1、箭头函数中的this是在声明中就定义好了的,而普通函数中的this则是在调用时定义好的。

2、箭头函数不绑定this, 它会捕获其所在(即定义的位置)上下文的this值, 作为自己的this值。正是因为它没有this,所以也就不能用作构造函数。,

3、若想改变this指向可以用bind方法。bind方法在ES5引入, 在Function的原型链上, Function.prototype.bind。通过bind方法绑定后, 函数将被永远绑定在其第一个参数对象上, 而无论其在什么情况下被调用。

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

Javascript 相关文章推荐
ie和firefox中img对象区别的困惑
Dec 27 Javascript
JObj预览一个JS的框架
Mar 13 Javascript
基于jQuery的js分页代码
Jun 10 Javascript
非常实用的12个jquery代码片段
Nov 02 Javascript
NPM 安装cordova时警告:npm WARN deprecated minimatch@2.0.10: Please update to minimatch 3.0.2 or higher to
Dec 20 Javascript
jQuery日程管理控件glDatePicker用法详解
Mar 29 jQuery
BootStrap Table 后台数据绑定、特殊列处理、排序功能
May 27 Javascript
JavaScript hasOwnProperty() 函数实例详解
Aug 04 Javascript
javascript简单实现深浅拷贝过程详解
Oct 08 Javascript
Jquery 动态添加元素并添加点击事件实现过程解析
Oct 12 jQuery
浅析Vue 中的 render 函数
Feb 28 Javascript
jQuery实现的移动端图片缩放功能组件示例
May 01 jQuery
如何通过JS实现转码与解码
Feb 21 #Javascript
TensorFlow.js 微信小程序插件开始支持模型缓存的方法
Feb 21 #Javascript
微信小程序使用 vant Dialog组件的正确方式
Feb 21 #Javascript
JS实现判断移动端PC端功能
Feb 21 #Javascript
JS获取表格视图所选行号的ids过程解析
Feb 21 #Javascript
微信小程序vant弹窗组件的实现方式
Feb 21 #Javascript
纯js实现无缝滚动功能代码实例
Feb 21 #Javascript
You might like
overlord人气高涨,却被菲利普频繁举报,第四季很难在国内上映
2020/05/06 日漫
使用php来实现网络服务
2009/09/15 PHP
ThinkPHP模板比较标签用法详解
2014/06/30 PHP
PHP return语句另类用法不止是在函数中
2014/09/17 PHP
PHP多进程之pcntl_fork的实例详解
2017/10/15 PHP
phpstorm 配置xdebug的示例代码
2019/03/31 PHP
JQuery里选择超链接的实现代码
2011/05/22 Javascript
jquery 插件学习(六)
2012/08/06 Javascript
仿谷歌主页js动画效果实现代码
2013/07/14 Javascript
获取数组中最大最小值方法js代码(自写)
2013/08/12 Javascript
jquery选择器-根据多个属性选择示例代码
2013/10/21 Javascript
分享JavaScript获取网页关闭与取消关闭的事件
2013/12/13 Javascript
禁用JavaScript控制台调试的方法
2014/03/07 Javascript
浅谈js中的闭包
2015/03/16 Javascript
jQuery简单实现图片预加载
2015/04/20 Javascript
Javascript中Array用法实例分析
2015/06/13 Javascript
JavaScript学习笔记之DOM基础 2.4
2015/08/14 Javascript
JavaScript学习小结之使用canvas画“哆啦A梦”时钟
2016/07/24 Javascript
AngularJS中$apply方法和$watch方法用法总结
2016/12/13 Javascript
underscore之Chaining_动力节点Java学院整理
2017/07/10 Javascript
在Vue项目中使用snapshot测试的具体使用
2019/04/16 Javascript
react组件基本用法示例小结
2020/04/27 Javascript
vue项目中播放rtmp视频文件流的方法
2020/09/17 Javascript
python获取文件扩展名的方法
2015/07/06 Python
Python文件监听工具pyinotify与watchdog实例
2018/10/15 Python
python频繁写入文件时提速的方法
2019/06/26 Python
英国Radley包德国官网:Radley London德国
2019/11/18 全球购物
模具专业推荐信
2013/10/30 职场文书
《忆江南》教学反思
2014/04/07 职场文书
《棉鞋里的阳光》教学反思
2014/04/24 职场文书
餐饮食品安全责任书
2015/01/29 职场文书
建议书格式
2015/02/04 职场文书
自主招生英文自荐信
2015/03/25 职场文书
介绍信怎么写
2015/05/05 职场文书
掌握一个领域知识,高效学习必备方法
2019/08/08 职场文书
SpringBoot 集成Redis 过程
2021/06/02 Redis