匿名函数的this指向

匿名函数

在函数表达式中,创建一个函数并将它赋值给一个变量,若此时function关键字后没有标识符,那么创建的函数可称为匿名函数

匿名函数中的this指向

在一般情况下,this对象是在运行时基于函数的执行环境绑定的。若是在全局函数中,则this指向window;当函数被作为某个对象的方法调用时,this指向该对象。但是在匿名函数中,因为匿名函数的执行环境具有全局性,所以它的this一般指向window。

var name = "The Window";
  var object = {
    name : "My Object",
    //var that=this; //可以更改this指向,使之指向当前的object对象
    getNameFunc : function(){
      return function(){
        return this.name;
      };
    }
  };
  alert(object.getNameFunc()());  // 输出为  The Window“”

上面的代码中,getNameFunc()函数中返回的是匿名函数,匿名函数中的this指向的是window,因此输出的是全局变量the window。
为什么?因为object.getNameFunc()()可以拆解如下

var  f = object.getNameFunc(); //返回的是一个匿名函数;
     f(); //相当于调用了该匿名函数,此时的调用者是window对象。所以this会指向window

如果想要匿名函数的this能够执行当前的object对象,那么就要更改this。可以在匿名函数外添加一行:var that=this—-即更改this的指向,更改this的指向还可以用call、apply、bind,输出代码改为下面这行即可将this指向更改指向object对象。call、apply、bind是有区别的,共同点是可以改变执行环境上下文且第一个参数都是指定的对象,不同点:1.apply的第二个参数是数组,这一点和call和bind不一样,call和bind可以传递多个参数。2.bind()返回了改变了执行上下文环境的函数但是不会立即执行该函数,而call()和apply()会直接执行该函数。

alert(object.getNameFunc().call(object));  //输出 “my object”
alert(object.getNameFunc().apply(object));  

  利用bind方法,bind(object)()

alert(object.getNameFunc().bind(object)());  

事例如下:
下述为一个匿名自执行函数,诚如所知,函数名实际上只是一个指向函数对象的指针,对于匿名函数而言,没有函数名。将匿名函数用一对圆括号包含表示是一个函数表达式(如:(function() {}),而后面的 () 表示调用

var a=2;
(function() {
     var a=3;
     return this.a;
})()       //输出为 2,this指向的是window
    原文作者:Qian_mos
    原文地址: https://blog.csdn.net/Qian_mos/article/details/84786502
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞