关于JavaScript中的对this的理解

关于this,一般来说谁调用了方法该方法的的this就指向谁,this指向当前调用的那个对象(我是最美的),回调函数里面的this都会指向(重)

如果存在多次调用,对象属性引用链只有上一层或者说最后一层在调用位置中起作用,如:

function foo() {     console.log( this.a ) }  var obj2 = {      a: 42,     foo: foo }  var obj1 = {     a: 2,     obj2: obj2 }  obj1.obj2.foo(); // 42

一个最常见的this绑定问题就是被隐式绑定的函数会丢失绑定对象,也就是说他回应用默认绑定,从而把this绑定到全局对象或者undefined上,取决于是否是严格模式。

function foo() {     console.log( this.a ) }  var obj1 = {     a: 2,     foo: foo }  var bar = obj1.foo; // 函数别名!  var a = "oops, global"; // a是全局对象的属性  bar(); // "oops, global"

虽然bar是obj.foo的一个引用,但是实际上,它引用的是foo函数本身,因此此时的bar()其实是一个不带任何修饰的函数调用,因此应用了默认绑定,一个更微妙、更常见并且更出乎意料的情况发生在传入回调函数时:

function foo() {     console.log( this.a ) }  function doFoo( fn ){     // fn 其实引用的是 foo     fn(); // <-- 调用位置! }  var obj = {     a: 2,     foo: foo }  var a = "oops, global"; // a是全局对象的属性  doFoo( obj.foo ); // "oops, global"

如何去改变this的指向,(简单的说就是指定this,如call、apply、bind、new绑定等)

1、变量来保存this的指向

2、2、bind() 改变this的指向 里面的参数是this的指向 放在花括号的结尾处

3、call() 改变this的指向 里面的参数 :第一个参数是this的指向 第二个参数以及后面所有的参数

如果是在立即执行函数中使用那么需要放在括号的外面

如果在定时器中使用则放在花括号的外面

4、apply():改变this的指向 里面的参数 :第一个参数是this的指向 第二个参数以及后面所有的参数

5、用法如下:

在就是new绑定:new是最后一种可以影响函数调用时this绑定行为的方法,我们称之为new绑定。

箭头函数的作用:

这里需要补充一点内容,就是在下一代javascript标准ES6中的箭头函数的 this始终指向函数定义时的 this,而非执行时。我们通过一个例子来理解:

var o = {     x : 1,     func : function() { console.log(this.x) },     test : function() {         setTimeout(function() {             this.func();         }, 100);     } };  o.test(); // TypeError : this.func is not a function

上面的代码会出现错误,因为this的指向从o变为了全局。我们需要修改上面的代码如下:

var o = {     x : 1,     func : function() { console.log(this.x) },     test : function() {         var _this = this;         setTimeout(function() {             _this.func();         }, 100);     } };  o.test();

this在箭头函数中应用:

1、一般情况下用在回调函数中  把function换成了=>

2、2、this的指向不在指向调用他的那个对象,而是指向创建他时的那个对象

总结:

1.如果要判断一个运行中的函数的this绑定,就需要找到这个函数的直接调用位置。找到之后就可以顺序应用下面这四条规则来判断this的绑定对象。

2.由new调用?绑定到新创建的对象。

3.由call或者apply(或者bind)调用?绑定到指定的对象。

4.由上下文对象调用?绑定到那个上下文对象。

5.默认:在严格模式下绑定到undefined,否则绑定到全局对象。

 

原文地址:https://www.cnblogs.com/xiongzewang/p/9123310.html

时间: 2024-10-13 21:10:02

关于JavaScript中的对this的理解的相关文章

javascript中 的 + RegExp[&#39;\x241&#39;] 怎么理解

\x24是十六进制转义符,16*2+4=36,ASCII码36代表的正是“$”符号(可以查ASCII码表),十六进制转义符的一般形式是'\xhh',h是0-9或A-F内的一个.$1是javascript全局对象 RegExp 的属性(可以查javascript API RegExp 对象),返回在模式匹配期间找到的.最近保存的部分+ 相当于 Number()函数(试了几种类型,两者效果一致,但不能确定). javascript正则表达式语法:\xn 匹配 n,其中 n 为十六进制转义值.十六进制

对JavaScript中变量类型的重新理解

<JavaScript启示录>这本书中提出:JavaScript中,对象为“王”(JavaScript里的几乎所有东西都是对象或者用起来像对象). 飞燕草对JavaScript最深刻的理解--也是这么久以来最有收获的一个认识:JavaScript的值有两种--原始值和对象(原始值的集合)组成.再直接一点,全部都可以理解为对象,原始值虽然不是对象,但是原始值拥有等效包装器对象,按照这么说的话,在JavaScript中真的可以说是对象为“王”. 一:原始值(或简单值) 1.原始值有5种:5(num

JavaScript中原型对象的彻底理解

一.什么是原型 原型是Javascript中的继承的继承,JavaScript的继承就是基于原型的继承. 1.1 函数的原型对象 ? 在JavaScript中,我们创建一个函数A(就是声明一个函数), 那么浏览器就会在内存中创建一个对象B,而且每个函数都默认会有一个属性 prototype 指向了这个对象( 即:prototype的属性的值是这个对象 ).这个对象B就是函数A的原型对象,简称函数的原型.这个原型对象B 默认会有一个属性 constructor 指向了这个函数A ( 意思就是说:c

JavaScript中一些怪异用法的理解

引言 JavaScript这门语言有些场合的用法还是比较怪异的.这篇文章会尽量将这门语言特有的一些比较特殊的用法收集在一起.就当是平时开发时需要注意的地方吧. 特殊用法收集 1.!!用法 在JavaScript中经常看到判断一个对象是否有某一个属性或者在进行客户端检测的时候会出现!!这个用法.相信大家都看到过var isIE=!!document.all这样的代码把.那为什么需要使用!!呢? !!作用就在于:如果明确设置了对象中属性的值(非 null/undefined/0/""等值)

javascript中 __proto__与prorotype的理解

我们先看看这样一段代码: 1 <script type="text/javascript"> 2 var Person = function () { }; 3 var p = new Person(); 4 </script> 我们来看看这个new究竟做了什么?我们可以把new的过程拆分成以下三步: <1> var p={}; 也就是说,初始化一个对象p. <2> p.__proto__=Person.prototype; <3&

javascript中重要概念-闭包-深入理解

在上次的分享中javascript--函数参数与闭包--详解,对闭包的解释不够深入.本人经过一段时间的学习,对闭包的概念又有了新的理解.于是便把学习的过程整理成文章,一是为了加深自己闭包的理解,二是给读者提供学习的途径,避免走弯路. 在javascript--函数参数与闭包--详解这篇文章中,我详细介绍了闭包的概念.以下的分享对闭包的基本概念只会稍稍带过.如果对闭包的概念不熟悉的同学,请移步至javascript--函数参数与闭包--详解. 以下的分享会分为如下内容: 1.let命令 2.闭包特

JavaScript中this指向的简单理解

首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然网上大部分的文章都是这样说的,虽然在很多情况下那样去理解不会出什么问题,但是实际上那样理解是不准确的,所以在你理解this的时候会有种琢磨不透的感觉),那么接下来我会深入的探讨这个问题. 为什么要学习this?如果你学过函数式编程,面向对象编程,那你肯定知道干什么用的,如果你没有学过,那么暂时可以不

JavaScript中对事件简单的理解

事件(event) 1.什么是JavaScript事件? 事件是文档或浏览器中发生的特定交互瞬间. 2.事件流 事件流描述的是从页面中接受事件的顺序,包含IE提出的事件冒泡流与Netscape提出的事件捕获流.浏览器默认的是事件冒泡流. 两种思想: IE的事件流叫做事件冒泡,即事件开始时由最具体的元素接受,然后逐级向上传播到较为不具体的节点.  Netscape团队提出的另一种事件流叫做事件捕获.事件捕获的思想是不太具体的DOM节点应该更早接收到事件,而最具体的节点应该最后接收到事件. 3.事件

JavaScript中对事件简单的理解(2)

事件(event) event对象 (1)什么是event对象? Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态.事件通常与函数结合使用,函数不会在事件发生前被执行! (2)Event相关方法与属性 1.谷歌 event.stopPropagation().IE event.CancelBubble=true:终止事件在传播过程的捕获.目标处理或起泡阶段进一步传播.调用该方法后,该节点上处理该事件的处理程序将被调用,事件不再被分派到其他节点