this

2017-11-25  本文已影响0人  别让我一个人醉_1fa7

JavaScript 中的 this 含义非常多,它可以是全局对象、当前对象或者任意对象,这完全取决于函数的调用方式

随着函数使用场合的不同,this的值会发生变化。但是有一个总的原则,那就是this指的是,调用函数的那个对象

1 作为函数调用

console.log(this);

function fn1(){
    console.log(this);
}

fn1();

2 内部函数

function fn0(){
    function fn(){
        console.log(this);
    }
    fn();
}

fn0();

3 setTimeout、setInterval

document.addEventListener('click', function(e){
    console.log(this);
    setTimeout(function(){
        console.log(this);
    }, 200);
}, false);

4 在构造函数中调用
构造函数能够用来生成一个新的对象(object),这是函数中的this就指向新的对象(object)
在创建对象时new操作符具有以下作用

function Person(name){
    this.name = name;
}
Person.prototype.printName = function(){
    console.log(this.name);
};

var p1 = new Person('Byron');
var p2 = new Person('Casper');
var p3 = new Person('Vincent');

p1.printName();//Byron
p2.printName();//Casper
p3.printName();//Vincent

5 在 JavaScript 中,函数也是对象,因此函数可以作为一个对象的属性,此时该函数被称为该对象的方法,在使用这种调用方式时,this 被自然绑定到该对象

var obj1 = {
    name: 'Byron',
    fn : function(){
        console.log(this);
    }
};

obj1.fn();//obj1
var a =obj1.fn
a()//window

6 DOM对象绑定事件

document.addEventListener('click', function(e){
    console.log(this);//document
    var _document = this;
    setTimeout(function(){
        console.log(this);//window
        console.log(_document);//document
    }, 200);
}, false);

7 Function.prototype.bind

var obj1 = {
    fn: function() {
        console.log(this)
    }
}
var fn3 = obj1.fn.bind(obj1);
fn3();//obj1

8 使用call和apply设置this

函数的执行环境

三种变量

例子

function ClassA(){
    var a = 1; //私有变量,只有函数内部可以访问
    this.b = 2; //实例变量,只有实例可以访问
}

ClassA.c = 3; // 静态变量,也就是属性,类型访问(函数也是对象)

console.log(a); // error
console.log(ClassA.b) // undefined(在实例创建之后才能访问到)
console.log(ClassA.c) //3

var classa = new ClassA();
console.log(classa.a);//undefined(a作为实例的属性没有被定义,与函数内部定义的变量a没有任何关系)
console.log(classa.b);// 2
console.log(classa.c);//undefined c是ClassA构造函数(对象)的属性创建实例时 new操作符只执行构造函数内部的代码,不会继承构造函数的其他属性
上一篇 下一篇

猜你喜欢

热点阅读