首页 > 代码库 > JavaScript this的指向问题
JavaScript this的指向问题
this的指向
在函数创建的时候,this的指向还未确定,它最终指向调用它的对象
window.onload=function(){
window.a="我的曾经"
function da(){
console.log(this.a)
}
da() //我的曾经
}
解:window对da()函数进行调用,故this指向window
window.onload=function(){
window.a="我的曾经"
var bn={
a:"小白",
da:function(){
console.log(this.a)
}
}
bn.da() //小白
}
解:bn对象对da()函数进行调用,故this指向window
window.onload=function(){
window.a="我的曾经"
var a="小白"
var bn={
a:"大白",
da:{
//a:"打包",
b:function(){
console.log(this.a)
}
}
}
bn.da.b() //undefined
}
解:da对象调用b()函数,故this指向da
window.onload=function(){
window.a="我的曾经"
var a="小白"
var bn={
a:"小白",
da:{
a:"打包",
b:function(){
console.log(this.a)
}
}
}
var hk=bn.da.b
hk() //我的曾经
}
解:var hk=bn.da.b这句话,将b()函数赋值hk,所以它调用的是window.hk(),故this指向window
构造函数的this指向
function this(){ this.user = "呵呵哒"; } var a = new this(); console.log(a.user); //呵呵哒
解:new关键字就是创建一个对象实例,所以a是个对象,所以函数this()被对象a调用,那么this指向的自然是对象a,对象a中会有user,是因为new关键字于复制了一份this()函数
function fu(){
this.user = "武器";
return {};
}
var a = new fu;
console.log(a.user); //undefined
function fu(){
this.name="大叔";
return 25;
}
var a=new fu;
console.log(a.name) //大叔
解:如果返回值是一个对象,那么this指向的就是那个返回的对象,如果返回值不是一个对象那么this还是指向函数的实例,如果return null,虽然null也是对象,但是在这里this还是指向那个函数的实例
call()
var a = {
user:"hhh",
fn:function(a,b){
console.log(this.user); //hhh
console.log(a+b); //8
}
}
var b = a.fn;
b.call(a,3,5);
解:call() 方法,它的第一个参数当做作 this 的对象。即this指向a,其他参数都直接传递给函数自身即b
apply()
var a = {
user:"hhh",
fn:function(a,b){
console.log(this.user); //hhh
console.log(a+b); //11
}
}
var b = a.fn;
b.apply(a,[3,5]);
解:apply() 方法有两个参数,用作 this 的对象和要传递给函数的参数的数组
bind()
var a = { user:"hhh", fn:function(aa,bb,cc){ console.log(this.user); //hhh console.log(aa,bb,cc); //1 2 3 } } var b = a.fn; var c = b.bind(a,1); c(2,3);
解:bind() 方法,它其实返回一个函数,它的第一个参数当做作 this 的对象。即this指向a,其他参数按顺序都传递给函数自身即b
this指向的应用
window.onload=function(){
var bn={
fn:function fn(){
function hj(){
console.log(this)
}
hj()
},
gn:function gn(){
function hj(obn){
console.log(obn)
}
hj(this)
},
bn:function bn(){
var that=this
function hj(){
console.log(that)
}
hj()
}
}
bn.fn() //window
bn.gn() //gn
bn.bn() //bn
}
正常情况,函数嵌套函数,里面函数的this指向window,那我们需要他指向嵌套他的函数时有两种方法;1:将this作为参数传递到被嵌套的函数里,2:将this赋值给一个变量,让被嵌套函数进行调用
JavaScript this的指向问题