作家
登录

别再为了this发愁了:JS中的this机制

作者: 来源: 2017-04-06 16:04:32 阅读 我要评论

 ); // 0 -- 耶?咋不是4捏?  

膳绫擎我们想要记录fn被调用的次数,可是明显fn被调用了四次但count仍然为0。咋回事捏?这里简单解释锫,fn里第4行的自增隐式的创建了一个全局变量count,因为初始值为undefined,所以每一次自增其实依然不是一个数字,你在全局情况下打印count(window.count)输出的应当是NaN。而第6行定义的函数熟悉变量count依然没变,照样0。如不雅对这个履行结不雅不清跋扈的,迎接去看我前些天的那篇博文(聊一下JS中的感化域scope和闭包closure scope和closure),在这里你只须要知道,this引用的是function这种懂得是缺点的久煨。

6、停止语

这边就会又有人问了,既然this不是引用function,那么我要实现递归函数,该咋引用呢?这里简单答复下介个问题,两种办法:①函数体内用函数名来引用函数本身②函数体内应用arguments.callee来引用函数(不推荐)。那么既然第二种办法不推荐,匿名函数咋引用呢?用第一种,并且给匿名函数一个函数名即可(推荐)。

3.2 误会二:this引用的是function的词法感化域

这种误会欺骗的人可能更多一些。起首,澄清一下,this并没有引用function的词法感化域。切实其实JS的引擎内对词法感化域的实现切实其实像是一个对象,拥有属性和函数,然则这仅仅是JS引擎的一种实现,对代率攀来说是弗成见的,也就是说词法感化域“对象”在JS代码中取不到。(关于词法感化域,如不雅不睬解,可以参考之前的一篇博文《聊一下JS中的感化域scope和闭包closure scope和closure》)。看个缺点的例子:

  1. function fn1() { 
  2.  
  3.     var a = 2; 
  4.  
  5.     this.fn2();//认为this引用的是fn1的词法感化域 
  6.  
  7.  
  8. function fn2() { 
  9.  
  10.     console.log( this.a ); 
  11.  
  12.  
  13. fn1(); //ReferenceError  

膳绫擎的代码明显没有履行出想要的结不雅,大年夜而可以看到this并没有引用函数的词法感化域。甚至,可以肯定的说,这个例子里fn2可以在fn1里精确履行都是有时的(懂得了词法感化域你就知道为什么这里履行不报错了)。

4、this到底跟啥有关?

好了,扯了那么多都没上干货,有的不雅众都开端封闭当前页开端离席了。这里,我们慎重声明:this跟函数在哪里定义没有半毛钱关系,函数在哪里调用才决定了this到底引用的是啥。也就是说this跟函数的定义没紧要,跟函数的履行有大年夜大年夜的关系。所以,记住,“函数在哪里调用才决定了this到底引用的是啥”。

5、this机制的四种规矩

this到底绑定或者引用的是哪个对象情况决定于函数被调用的处所。而函数的调用有不合的方式,在不合的方法中调用决定this引用的是哪个对象是由四种规矩肯定的。我们一个个来看。

5.1 默认绑定全局变量

这条规矩是最常见的,也是默认的。当函数被零丁定义和调用的时刻,应用的规矩就是绑定全局变量。如下:

  1. function fn() { 
  2.  
  3.     console.log( this.a ); 
  4.  
  5.  
  6. var a = 2; 
  7.  
  8. fn(); // 2 -- fn零丁调用,this引用window  

5.2 隐式绑定

隐式调用的意思是,函数调用时拥有一个高低文对象,就似乎这个函数是属于该对象的一样。例如:

如上,第8行固然有隐式绑定,然则它履行的效不雅明显是把fn赋给bar。如许bar履行的时刻,依然是默认绑定全局变量,所以输出结不雅如上。

  1. function fn() { 
  2.  
  3.     console.log( this.a ); 
  4.  
  5.  
  6. var obj = { 
  7.  
  8.     a: 2, 
  9.  
  10.     fn: fn 
  11.  
  12. }; 
  13.  
  14. obj.fn(); // 2 -- this引用obj。 

      推荐阅读

      监测和管理:现代数据中心的主要考虑因素

    上个月,我们在《创建数据中间监控筹划的最佳实践筹划》一文中商量了一个异常有趣的话题。然则,似乎关于这方面话题的评论辩论远未停止。在以前的一个月中,我收到了大年夜量关于现代数据>>>详细阅读


    本文标题:别再为了this发愁了:JS中的this机制

    地址:http://www.17bianji.com/lsqh/34612.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)