Javascript中的'this'是指什么

我理解this关键字背后的一般想法,但我在实践中很难弄清楚它实际上指的是什么。 例如,在这两个示例练习中,我猜错了数字。

对于question1,我说alert是'5',因为它指的是函数中匿名函数之外的this.x。

问题2中,我认为警报将是5,因为这条线

var alertX = o.alertX;

将变量o中属性x的值5绑定到新变量'alertX',该变量将成为下一行中的函数调用:alertX();

你能解释我为什么错了吗?

var question1 = function() {
    this.x = 5;
     (function() {
        var x = 3;
        this.x = x;
    })();
    alert(this.x);
};
var answer1 = 3; 


var question2 = function() {
    this.x = 9;
    var o = {
        'x':5,
        'alertX':function() { alert(this.x); }
    };
    var alertX = o.alertX;
    alertX();
}
var answer2 = 9; 

这是多么有趣这将成为在Javascript很好的例子。 总是指它被调用/调用的上下文,而不是简单地在那一刻! question2就是一个很好的例子。

我假设你是这样调用全局的:

question1();
question2();

问题1:

你有一个匿名函数在你第一次将x设置为5之后运行。这个匿名函数如果没有设置为一个变量,在一个函数等内部,它将被设置为窗口的全局变量。 但是你在一个函数内设置它并设置为变量question1。 所以当它自己运行时,它将这个 (它是question1函数) x变量设置为3。

问题2:

X最初的设置9,在这种情况下是问题2。 现在抛弃你的部分是,即使在o {}对象中设置了x : 5 。 你的alertX函数调用this.x. 所有这些都会导致你认为它会提醒5! 但是你在o {}对象之外调用你的alert函数,因此这又指向question2函数!


在第一种情况下,当您调用没有明确接收方的方法时, this是Global对象(Web浏览器中的window )。

类似地,在第二种情况下:即使该功能的对象上定义,而你在另一个内部,通过调用与所述功能alertx()this被设置为全局/ window

简而言之:

  • 对于foo.bar()barthis内部将是foo
  • 对于bar()this将是Global对象。
  • 这包括所谓的“自我调用lambdas”,即(function(){ ... })()
  • 对于bar.call(whee)bar.apply(whee)this将是whee (因为这就是这些方法所做的)。
  • 另一个例子:

    var o1 = { name:"o1", f:function(){ console.log(this.name) } };
    var o2 = { name:"o2" };
    o2.gogogo = o1.f;
    o2.gogogo(); // Will output "o2"
    

    将以下内容放入浏览器的控制台中

    var x = -1, log = function(){ // set up some stuff
    if(console) if(console.log) return console.log.apply(console, arguments),undefined;
    return alert(arguments.join(', ')),undefined;
    },
    question1 = function() {
        this.x = 5; // question1.x is 5
         (function() { // anonymous function fires in global 'window'
            var x = 3; // so window.x is now 3
            this.x = x; // this is window
        })();
        log('ans1',this.x,this); // see below
    },
    question2 = function() {
        this.x = 9; // question2.x is 9
        var o = {
            'x':5,  // o.x is 5
            'alertX':function() { log('ans2',this.x,this); }
        };
        var alertX = o.alertX; // alertX === o.alertX
        alertX(); // being called in global scope
    
        // to make alertX have scope of question2
        this.alertX = o.alertX; // this is question2
        this.alertX(); // so we're calling from question2
    },
    a1 = new question1(), // note the new operator
    a2 = new question2();
    undefined;
    

    你会得到的

    ans1 5 question1
    ans2 3 Window
    ans2 9 question2
    
    链接地址: http://www.djcxy.com/p/11177.html

    上一篇: what does 'this' refer to in Javascript functions

    下一篇: Best way to access attributes