膳绫擎我们想要记录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》)。看个缺点的例子:
- function fn1() {
- var a = 2;
- this.fn2();//认为this引用的是fn1的词法感化域
- }
- function fn2() {
- console.log( this.a );
- }
- fn1(); //ReferenceError
膳绫擎的代码明显没有履行出想要的结不雅,大年夜而可以看到this并没有引用函数的词法感化域。甚至,可以肯定的说,这个例子里fn2可以在fn1里精确履行都是有时的(懂得了词法感化域你就知道为什么这里履行不报错了)。
4、this到底跟啥有关?
好了,扯了那么多都没上干货,有的不雅众都开端封闭当前页开端离席了。这里,我们慎重声明:this跟函数在哪里定义没有半毛钱关系,函数在哪里调用才决定了this到底引用的是啥。也就是说this跟函数的定义没紧要,跟函数的履行有大年夜大年夜的关系。所以,记住,“函数在哪里调用才决定了this到底引用的是啥”。
5、this机制的四种规矩
this到底绑定或者引用的是哪个对象情况决定于函数被调用的处所。而函数的调用有不合的方式,在不合的方法中调用决定this引用的是哪个对象是由四种规矩肯定的。我们一个个来看。
5.1 默认绑定全局变量
这条规矩是最常见的,也是默认的。当函数被零丁定义和调用的时刻,应用的规矩就是绑定全局变量。如下:
- function fn() {
- console.log( this.a );
- }
- var a = 2;
- fn(); // 2 -- fn零丁调用,this引用window
5.2 隐式绑定
隐式调用的意思是,函数调用时拥有一个高低文对象,就似乎这个函数是属于该对象的一样。例如:
如上,第8行固然有隐式绑定,然则它履行的效不雅明显是把fn赋给bar。如许bar履行的时刻,依然是默认绑定全局变量,所以输出结不雅如上。