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()
, bar
的this
内部将是foo
。 bar()
, this
将是Global对象。 (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