在上篇执行上下文中,在建立阶段中,工作之一就是this值的赋值,那什么是this呢?一起学习下。
主要看了王福朋的一篇文章:http://www.cnblogs.com/wangfupeng1988/p/3988422.html
先看一个例子:
var name = "dog";
var nameObj ={
name : "cat",
showName : function(){
alert("this:"+this+";this.name:"+this.name);
},
waitShowName : function(){
setTimeout(this.showName, 1000);
}
};
nameObj.waitShowName();
结果是:
由图可知,this是window,而this.name自然就是"dog",可this.name为什么不是"cat"呢?
根据王福朋的文章,再测试一下几种情况:
情况1:构造函数
function add(){
this.name = "niulina";
this.age = 24;
console.log(this);
}
var a = new add();
结果:
所谓构造函数就是用来new对象的函数。而构造函数中的this指代的是拥有属性name,age的对象a。
若不new一个对象出来,那this指代的是:
function add(){
this.name = "niulina";
this.age = 24;
console.log(this);
}
add();
结果:
那在这种情况下,this指代的是window。
情况2:函数作为对象的一个属性
var obj = {
x:10,
fn:function(){
console.log(this);
console.log(this.x);
}
};
obj.fn();
结果:
由结果可知:函数fn被作为obj对象的属性,此时的this指代的是obj对象。
如果把fn单提出来后调用会怎样?
var obj = {
x:10,
fn:function(){
console.log(this);
console.log(this.x);
}
};
var fn1 = obj.fn;
fn1();
结果:
如果被fn函数被赋给fn1,然后在全局环境中调用,this指的就是window。
情况3:函数用call或者apply调用
var obj = {
x:10,
};
var fn = function(){
console.log(this);
console.log(this.x);
}
fn.call(obj);
结果:
调用call后,this指代的是对象obj,这是因为在call函数中,改变的this的指向。apply函数同理。
情况4:全局 & 调用普通函数
var x = 10;
var fn = function(){
console.log(this);
console.log(this.x);
}
fn();
结果:
由结果可知,在全局环境下,this指代的是window。
有一个情况比较特殊:
var obj = {
x:10,
fn:function(){
function f(){
console.log(this);
console.log(this.x);
}
fn();
}
};
obj.fn();
结果:
f函数在fn函数中定义幷被调用,但其this指代的还是Window。
所以说:
一般而言,在Javascript中,this指向函数执行时的当前对象。this关键字在Javascript中和执行环境,而非声明环境有关。