首页 > 代码库 > 浅谈this指向问题

浅谈this指向问题

刚开始学习js,被this弄得晕头转向,回过头来也想总结一下希望能帮助正被this‘折磨’的人

我们先来看看直接执行this的情况

alert(this);//指向的是window

函数中执行

function foo(){
   alert(this);
}
foo();//window

把函数赋值给变量执行

var foo = function(){
    alert(foo);
}
foo();//window

上面直接执行的例子指向的都是window为什么会这样呢?

如果看过前面的学习总结一定知道,window是全局变量的对象,其实alert就是window的属性我们可以写成这样:

window.alert(this)

函数的例子也可以写成这样

function foo(){
   alert(this);
}
window.foo();//window

当你看到foo()这种‘xxx()’的调用方式,那它就是指向的window,这对你理解是有帮助的

 

回过头来看一下this:this指的就是调用 当前 方法(函数)的那个对象


我们再来看一个例子

<!DOCTYPE html>
<html lang="">
<head>
  <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>js-this指向</title>
<script>
    function foo(){
       alert(this);
    }
</script>
</head>
<body>
<input type="button" value="http://www.mamicode.com/按扭1" id="btn">
<script>
    ‘use strict‘;
    var text = document.getElementById("btn");
     text.onclick= foo;//text
</script>
</body>
</html>

但我们这样写的话

<!DOCTYPE html>
<html lang="">
<head>
  <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>js-this指向</title>
<script>
    function foo(){
       alert(this);
    }
</script>
</head>
<body>
<input type="button" value="http://www.mamicode.com/按扭1" id="btn">
<script>
    ‘use strict‘;
    var text = document.getElementById("btn");
     text.onclick= function(){
        foo();?想想会弹出什么
     }
</script>
</body>
</html>

答案是:window ==》当你看到foo()这种‘xxx()’的调用方式,那它就是指向的window,这对你理解是有帮助的

我们进入实战演练一<!DOCTYPE html>

<html lang="">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>jsthis指向</title>
</head>
<body>
<input type="button" value="http://www.mamicode.com/按扭1">
<input type="button" value="http://www.mamicode.com/按扭2">
<input type="button" value="http://www.mamicode.com/按扭3">

<script>
window.onload=function(){
var aLi = document.getElementsByTagName("input");
for(var i = 0;i<aLi.length;i++){
aLi[i].onmouseover = foo;

}
}
function foo(){
this.style.background = "red";
}
</script>
</body>
</html>

小伙伴们我们在修改一下

<html lang="">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>jsthis指向</title>
</head>
<body>
<input type="button" value="http://www.mamicode.com/按扭1">
<input type="button" value="http://www.mamicode.com/按扭2">
<input type="button" value="http://www.mamicode.com/按扭3">

<script>
window.onload=function(){var aLi = document.getElementsByTagName("input");
for(var i = 0;i<aLi.length;i++){
aLi[i].onmouseover =function(){
   foo();
};
} 
}
function foo(){
this.style.background = "red";
}
</script>
</body>
</html>

这样做会报错,因为foo()函数this指向的是window而不是aLi的元素

我们通过将this赋值给一个变量就可以解决这个问题

<html lang="">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>jsthis指向</title>
</head>
<body>
<input type="button" value="http://www.mamicode.com/按扭1">
<input type="button" value="http://www.mamicode.com/按扭2">
<input type="button" value="http://www.mamicode.com/按扭3">

<script>
window.onload=function(){
var aLi = document.getElementsByTagName("input");
for(var i = 0;i<aLi.length;i++){
aLi[i].onmouseover =function(){
   that = this;
   foo();
};
} 
}
function foo(){
  that.style.background = "red";
}
</script>
</body>
</html>

这样我们就解决了关于this指向的问题。

希望对你理解this的指向有个重新的认识

谢谢阅读

(完

浅谈this指向问题