我理解this
关键字背后的一般概念,但我无法弄清楚它在实践中实际指的是什么。例如,在这两个示例练习中,我猜错了数字。
在问题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;
答案 0 :(得分:3)
在第一种情况下,当您调用没有显式接收器this
的方法时,是Global对象(Web浏览器中的window
)。
类似地在第二种情况下:即使函数是在对象上定义的,而你在另一个内部,通过使用alertx()
调用函数,this
被设置为Global / {{1 }}
简而言之:
window
,foo.bar()
内的this
将为bar
。foo
,bar()
将是全局对象。
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