打牢基础,方能以不变应万变
昵称:
园龄: 1年11个月
粉丝: 1
关注: 1

js中的this

javascript是一种非常活跃的语言,其中关于其中的this关键字,是javascript中的核心概念之一,今天来讨论下js中的this关键字。

说到this,大部分情况下会想到两种关于this的常见常见使用场景

  • js上下文中的this
  • js操作DOM节点的this
  • 构造函数中的this

这个两个不论哪一种情况,在js中都遵循:谁调用this,this就指向谁

一、js上下文中的js

1、普通的函数调用

先来看下面的代码

a = 6; // 相当于window.a=6 或 this.a=6
function fun() {
    console.log(this.a)
};
fun();  // 相当于window.fun()
// 6

如上执行结果,最终打印出来的结果为6

由于调用fun()函数相当于window.fun()调用,即fun()函数由window调用,并且window对象上定义了变量a,所以函数里的this指向window对象,打印出来的结果就是window.a=6

2、对象中的this

同普通的函数调用不一样,对象里的this指向要相对复杂些

this.a = 100;
var obj = {
    a: 10,
    fun: function() {
        console.log(this.a)
    }
};
obj.fun();
// 结果为10

上面代码执行结果为10,这个应该就很好理解,因为调用函数的obj对象,obj里定义了obj.a=10,所以打印结果为10,但是当函数里采用了闭包之后又会出现不同的结果,如下代码

this.a = 100;
var obj = {
    a: 10,
    fun: function() {
        console.log(this.a)
        return function() {
            console.log(this.a)
        }
    }
};
obj.fun()();    // (obj.fun())();
// 10
// 100

执行结果为,先打印出10,再打印出100,为什么会出现这样的情况呢?

第一个结果为10肯定是不会有疑惑了,因为同上面那一种情况相同,obj调用fun()函数,第一个this同样指向obj,结果为obj.a=10

第二个结果为100,是因为执行了obj.fun()之后,返回了里面的闭包函数,此时返回来的函数是在window作用域中执行的,相当于是在window对象中调用闭包函数,所以第二个结果为100;上面的调用方式也可以像下面的调用方式一样

this.a = 100;
var obj = {
    a: 10,
    fun: function() {
        console.log(this.a)  // 10
        return function() {
            console.log(this.a)  //100
        }
    }
};
var fun1 = obj.fun();  // 将返回来的函数赋值给fun1
window.fun1();  // 在window对象中调用fun1

上面的调用方式应该会更好理解一些

 

二、js操作DOM节点的this

除了在操作对象中经常使用js外,对DOM的操作同样也会经常使用到this,看下面需求

// 点击button,改变button的字体颜色
function changeColor() {
    this.style.color = "red";
}

var btn = document.getElementById('btn');
btn.onclick = changeColor;

上面点击按钮,按钮字体颜色变成红色,这里同样适用谁调用:this,this就指向谁

此时的this指向btn节点

在例如下面代码

<button id="app" style="color:blue">click</button>
var style = {
    color: "red"
};
window.fun(); // red
function fun() {
    alert(this.style.color)
}
var btn = document.getElementById('app');
btn.onclick = fun; // blue

 

三、构造函数中的this

this.a = 100;
function fun() {
    this.a = 10;
}
fun.prototype.geta = function() {
    return this.a;
}
var fun1 = new fun();
console.log(fun1.geta()); // 10

此处输出10,因为fun1调用geta()函数,fun函数是fun1的构造函数,所以fun1中含有属性a=10,调用原型中geta方法,返回的就是this.a=10;

posted @ 2018-12-05 10:56  啷哩个啷~  阅读(527)  评论(0编辑  收藏  举报