“这个”在Javascript函数中引用了什么

时间:2012-09-04 23:05:27

标签: javascript

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

对于问题1,我说警报将是'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; 

3 个答案:

答案 0 :(得分:3)

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

类似地在第二种情况下:即使函数是在对象上定义的,而你在另一个内部,通过使用alertx()调用函数,this被设置为Global / {{1 }}

简而言之:

  • 对于windowfoo.bar()内的this将为bar
  • 对于foobar()将是全局对象。
    • 这包括所谓的“自我调用的羔羊”,即this
  • 对于(function(){ ... })()bar.call(whee)bar.apply(whee)将为this(因为这就是这些方法的作用)。

另一个例子:

whee

答案 1 :(得分:0)

这些是这个在Javascript中变得有趣的好例子。 始终指的是调用/调用的上下文,而不仅仅是当时的位置!问题2就是一个很好的例子。

我假设你像这样全局调用这些:

question1();
question2();

问题1:

你有一个匿名函数,在你第一次将x设置为5之后运行。这个匿名函数如果没有设置为变量,在函数等中,设置为全局变量窗口。但是你有一个功能和功能;设置为变量question1。所以当它自己运行时,它会将这个的(这是问题1函数) x 变量设置为3。

问题2:

X最初设置为9,在此实例中为question2。现在,让你失望的部分是,即使在 o {} 对象中你设置了x : 5。而你的alertX函数正在调用this.x.所有这一切都会让你觉得它会提醒5!但是你在 o {} 对象之外调用你的警报功能,因此 this 再次引用了question2函数!

答案 2 :(得分:0)

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

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