'this'的4种不同场景。 什么是正确的解释?

这些都是从tuts-premium Jquery vid教程中获得的。
http://tutsplus.com/lesson/the-this-keyword/杰夫解释了每次“这”是指什么,但我不确定我是否掌握了所有背后的推理。

例如1

function doSomething(e) { 
e.preventDefault(); 
console.log(this);
} 

$('a').on('click', doSomething);

在这种情况下,“这指的是'a'元素”(在这种情况下是父对象)

我想这是因为这里的声明等同于:

$('a').on('click', function (e) { 
    e.preventDefault(); 
    console.log(this);
    } 

所以'a'是父对象

例如2

var obj = { 
    doIt: function(e){ 
    e.preventDefault(); 
    console.log(this);
    }
}

$('a').on('click',  obj.doIt);

在这种情况下“这仍然指'a'元素”(*但显然它不是父对象?)

看来这次我们正在调用一个方法,但是这个陈述仍然与Eg 1相同

*教程中的一件事让我有点困惑。 我认为'this'总是指向父对象,所以在这种情况下'a'仍然是父对象。 但是(在本教程的05.23中),他推断事实并非如此,他说“有时候你想要'这个'来引用它的父对象,这个父对象将是'obj'”,在这个事件中他创建eg3。

例如3

var obj = { 
    doIt: function(){ 
    console.log(this);
    }
}

$('a').on('click',  function(e){    
obj.doIt(); 
        };
e.preventDefault(); 

在这种情况下,“这指的是obj对象”

我认为这是因为'this'是嵌套函数,因为这个陈述等同于:

$('a').on('click',  function(){    
function(){ console.log(this);}
};
e.preventDefault(); 

我不明白为什么,特别是当我在一篇文章中看到嵌套函数“this”失去它的方式并引用头对象(窗口对象)时“。

EG4

var obj = { 
    doIt: function(){ 
    console.log(this);     
    }
}

$('a').on('click',  function(e){    
       obj.doIt.call(this);             
       e.preventDefault(); 
});

在这种情况下“这指的是'一''”

根据Javascript定义指南“第一个参数都是调用函数的对象”这里“这个”被用作第一个参数。 但是“this”不是函数被调用的对象??
我想我得到的调用函数在那里调用函数,并使用它的第一个参数作为指向不同对象的指针,但我不明白为什么使用'this'意味着该函数被'a'调用。 这不是我在其他调用()示例中看到的。

对不起,这么庞大的职位。 希望这个阶段有人还在读书......


我希望这有助于澄清问题,确实可能会造成混淆。

  • this是在你的代码松动,将引用全局对象(在Web浏览器,即window )。

    console.log(this); // window
    
  • this在一个对象方法内时(例如你的Eg 3),它会引用该对象。 这适用于使用new或作为对象文字实例化的对象(如您的示例)。

     var obj = { 
         doIt: function(e){ 
             console.log(this);
         }
     }
     obj.doIt(); // obj
    
  • 在事件处理程序中, this将引用事件绑定的对象。

    // This is the plain js equivalent of your jQuery example
    document.getElementsByTagName['a'][0].addEventListener('click', function(e){
        console.log(this); // the first anchor on the document
    });
    
    // This is exactly the same:
    var clickHandler = function(e){
        console.log(this); // the first anchor on the document
    };
    document.getElementsByTagName['a'][0].addEventListener('click', clickHandler); 
    
    // Even if the handler is defined inside of another object, this will be
    // the obj the event is bound to. It's the case of your E.g. 2
    var obj = { 
        doIt: function(e){  
            console.log(this); // the first anchor on the document
        }
    }
    document.getElementsByTagName['a'][0].addEventListener('click', obj.doIt);
    // When you pass obj.doIt to addEventListener above, you are passing a reference
    // to that function. It's like "stealing" the function from the object
    
  • 当一个对象作为第一个参数传递给Function.callFunction.apply ,如果this出现在函数内部,它将引用你传递的对象。 这是一种迫使this将指向的方式。

    var obj = { 
        doIt: function(){ 
            console.log(this); // window 
        }
    }
    obj.doIt.call(window);
    

  • https://developer.mozilla.org/en/JavaScript/Reference/Operators/这是对this关键字的简短介绍。 并查看call()的参考。

    随着jQuery在dom元素的上下文中调用(是的,使用.call()方法)事件处理程序,所有示例都将被解释。


    该方式this表现在JavaScript是有点混乱在第一。 基本上,与变量(它们是静态范围的)不同, this是动态范围的。 也就是说,值this是在那里你调用该函数,而不是在那里你写的决定。

    当你将你的函数传递给它on ,它将在一个上下文中被调用,在this上下文中this是所讨论的元素。 无论您如何获得该功能,都会发生这种情况。 也就是说,一个函数并不关心你是否使用访问语法喜欢obj.fn或只是它的名字fn表达的--the值是在两种情况下是相同的。

    除了函数之外,这是有道理的。 鉴于:

    var a   = 10,
        obj = { a : 10 };
    

    你会同意表达式aobj.a具有相同的值。 功能也是如此。

    简而言之, this取决于你调用函数的地点和方式,而不是你声明它的方式和位置,或者你在调用它之前如何引用它。

    链接地址: http://www.djcxy.com/p/58845.html

    上一篇: 4 different scenarios of 'this'. What's the correct interpretation?

    下一篇: ASP.NET Web API with DotNetOpenAuth