嵌套函数中的Javascript“this”指针

我有一个关于如何在嵌套函数场景中处理“this”指针的问题。

假设我将下面的示例代码插入到网页中。 当我调用嵌套函数“doSomeEffects()”时出现错误。 我检查了Firebug,它表明当我在嵌套函数中时,“this”指针实际上指向全局的“窗口”对象 - 这是我没有想到的。 我不能正确地理解某些东西,因为我认为自从我在对象的函数中声明嵌套函数以来,它应该具有与该函数相关的“本地”范围(即,“this”指针将指向对象本身这是如何在我的第一个“如果”声明)。

任何指针(没有双关语意)将不胜感激。

var std_obj = {
  options : { rows: 0, cols: 0 },
  activeEffect : "none",
  displayMe : function() {

    // the 'this' pointer is referring to the std_obj
    if (this.activeEffect=="fade") { }

    var doSomeEffects = function() {

      // the 'this' pointer is referring to the window obj, why?
      if (this.activeEffect=="fade") { }

    }

    doSomeEffects();   
  }
};

std_obj.displayMe();

在JavaScript中, this对象实际上是基于你如何进行函数调用。

通常有三种方式来设置this对象:

  • someThing.someFunction(arg1, arg2, argN)
  • someFunction.call(someThing, arg1, arg2, argN)
  • someFunction.apply(someThing, [arg1, arg2, argN])
  • 在上面所有的例子中, this对象都是一些someThing 。 调用没有前导父对象的函数通常会得到全局对象,这在大多数浏览器中意味着window对象。


    this不是闭合范围的一部分,它可以被认为是绑定在呼叫站点的函数的附加参数。 如果方法不被称为一种方法则全局对象是作为传递this 。 在浏览器中,全局对象与window相同。 例如,考虑以下功能,

    function someFunction() {
    }
    

    和下面的对象,

    var obj = { someFunction: someFunction };
    

    如果您使用方法语法(如,

    obj.someFunciton();
    

    那么this是绑定到obj

    如果你直接调用someFunction(),比如,

    someFunction();
    

    那么this绑定到全局对象,即window

    最常见的解决方法是将其捕获到闭包中,例如,

    displayMe : function() {      
    
        // the 'this' pointer is referring to the std_obj      
        if (this.activeEffect=="fade") { }      
        var that = this;  
        var doSomeEffects = function() {      
    
          // the 'this' pointer is referring to global
          // that, however, refers to the outscope this
          if (that.activeEffect=="fade") { }      
        }      
    
        doSomeEffects();         
     }      
    

    由于这似乎是同类问题中最有争议的问题之一,因此,让我补充一下这些年来使用箭头函数的ES6解决方案:

    var std_obj = {
      ...
      displayMe() {
        ...
        var doSomeEffects = () => {
                            ^^^^^^^    ARROW FUNCTION    
          // In an arrow function, the 'this' pointer is interpreted lexically,
          // so it will refer to the object as desired.
          if (this.activeEffect=="fade") { }
        };
        ...    
      }
    };
    
    链接地址: http://www.djcxy.com/p/2779.html

    上一篇: Javascript "this" pointer within nested function

    下一篇: Coding Style Guide for node.js apps?