重要的事情先讲三遍:谁调用this,this指向谁!谁调用this,this指向谁!谁调用this,this指向谁!
(1)this由test调用,this指向window,结果this.m的值为100。
window.m=100;//window.m=100等价于 this.m=100
function test(){
alert(this.m);
}
window.test();//test()等同于window.test()
(2)this由test调用,test由obj调用,因此this.m的值就为obj.m的值,为100.
this.m=1000;
var obj = {
m:100,
test:function(){
alert(this.m);
}
}
obj.test();
(3)return function()已经将自己从obj中抛出来了,此时它指向外面的window,因此this.m的值为1000
this.m=1000;
var obj = {
m:100,
test:function(){
alert(this.m);
//闭包
return function(){
alert(this.m);
}
}
};
obj.test()();
obj.test()一个括号调用test()的函数,但不包括return后的函数;
obj.test()()两个括号可以执行到return后的函数。
也可以写成:(obj.test())();
或者:var t = obj.test(); window.t();
(4)当在外部调用函数test()时,this指向window,就会执行color:"green"的代码。点击按钮时,是button调用test()函数,因此this指向button。
html
<input type="button" id="test" value="点击一下" style="color:red;">
JavaScript
var style = {
color:"green"
}
function test(){
alert(this.style.color);//this指向button
}
document.getElementById("test").onclick=test;
window.test();
(5)结果为1,p调用了geta(),geta()被挂在test原型上,p又是test声明出来的,因此p应该找到test()下的this.a 与外面的1000无关。
this.a=1000;
function test(){
this.a=1;
}
test.prototype.geta = function() {
return this.a;
};
var p = new test;
console.log(p.geta());//1
(6)结果为1,p是test()声明的,因此直接执行test()函数,与test.prototype.a = 100;无影响
function test(){
this.a=1;
}
test.prototype.a = 100;
var p = new test;
console.log(p);//1
(7)结果仍然为1,因为this的主动权大,因为它在构造函数中。
function test(){
this.a=1;
}
test.prototype.a = 100;
var p = new test;
console.log(p.a);//1
内容为JavaScript关于this的小总结,如果有不正确的地方欢迎小伙伴们指正哦~
网友评论