javscript中this初探

This

This是什么:
this是一个特别的关键字,是自动定义在全部函数和全局的做用域中。this是在运行时绑定的,而不是声明时绑定的。javascript

为何要有this
假设不存在this关键字,那么对于一个函数根据不一样上下文背景下的复用就用传入参数java

var obj = Object.create(null);

        obj.name = 'Nico';

        function speak(context) {
            console.log(context.name + " speaks a word");
        }

        speak(obj);

this指向的几种状况:
一、通常状况下,this是指向当前执行时的对象app

var person = {
    name: 'nico',
    getName: function() {
        console.log(this.name)
    }
}

var name = 'siip';

person.getName(); //nico

person对象调用getName方法,因此当前this指向的是person对象函数

二、若是没有明确对象时,this指向全局对象(在非严格模式下,在严格模式下,函数绑定undefined,也就是this指向undefined)this

var name = 'siip';

function className() {
    console.log(this.name);
}

className();//siip

其实这里的className可类似于window.className,因此当前this指向window
三、setTimeout、setInterval、匿名函数this指向全局对象prototype

var person = {
    name: 'nico',
    fns: function() {
        setTimeout(function() {
            console.log(this.name)
        }, 100);//siip

        setInterval(function() {
            console.log(this.name)
        }, 100);//siip

        (function() {
            console.log(this.name)
        })()//siip
    }
}
var name = 'siip';
person.fns();

这些方法都比较容易理解this的指向,由于匿名函数或者定时器函数都是挂载window上的函数,调用者是window对象,这些函数里声明的函数,也指向调用者,相似于:code

function foo() {
            function bar() {
                console.log(this)
            }
            bar();
        }

        foo();

四、apply、call可以改变this指向(无参数时或者传入null、undefined,指向window)对象

var person = {
        name: 'nico',
        applyFns: function() {
            console.log(this.name)
        }
    }
    var name = 'siip';
    person.applyFns();//nico
    person.applyFns.apply();//siip

有时候,ip

五、new Function 构造函数中的this指向该构造函数new出来的对象。作用域

由于new Function的过程大概:

  1. 建立一个新的空对象
  2. 空对象_proto_指向Function.prototype
  3. 空对象与当前函数调用的this绑定
  4. 返回新建立对象

因此new Function中的this指向return的对象。

小结

this的指向取决于函数执行时的块级上下文

相关文章
相关标签/搜索