javascript的this对象

我们晓得,this对象是在运行时基于实行函数的实行环境绑定:在全局函数中,this即是window,而当函数被当作某个对象的要领挪用时,this即是谁人对象。

this的运用环境分以下几种状况:

  • 一般函数挪用
  • 作为组织函数挪用
  • 作为对象的要领来挪用
  • call/apply/bind要领的挪用

一般函数挪用

纯真函数挪用属于全局挪用,this指向this指向Global对象,在浏览器着就是window对象。

var name = "the window";
function fn(){
    alert(this.name);
}
fn();    //the window

这个例子很好明白。在全局作用域中声明的变量、函数,都邑变成window对象的属性、要领,this指向window

var length = 10
function fn(){
    alert(this.length)
}
var obj = {
    length: 5,
    method: function(fn) {
        fn() // ?
        arguments[0]() // ?
    }
}
obj.method(fn)      //10  1

这个例子就不太好明白了。这里fn依旧是纯真的函数挪用,我们晓得,每一个函数在被挪用时,都邑自动获得两个特别变量:this和arguments。内部函数搜刮这两个变量时,只会搜刮到其运动对象为止。所以这里fn中的this指向window。
别的要注意arguments是一个对象,对象属于除了点操作符还可以用中括号,arguments[0]()实际上是fn作为arguments对象的要领被挪用,this指向arguments,由于参数只要一个fn,因而length为1

var length = 10
var obj = {
    length: 5,
    method: function() {
        function fn(){
            alert(this.length)
        }
        fn();
    }
}
obj.method()     //10

再轻微变更一下代码,this依旧指向window

作为对象的要领挪用

函数被作为某个要领时,this即是谁人对象

var length = 10
function fn(){
    alert(this.length)
}
var obj = {
    length: 5,
    method: fn
}
obj.method()      //5

再换一个例子

function fn(){
    alert(this.length)
}
var obj1 = {
    length: 5,
    method: fn
}
var obj2 = {
    length: 6,
    method: obj1.method
}
obj2.method()      //6

作为组织函数挪用

经由过程new操作符来挪用函数,建立一个新的对象,将组织函数的作用域给予给新对象,因而this指向这个新对象。

var name = "windowName";
function fn(name){
    this.name = name;
    this,sayName = function(){
        alert(this.name);
    }
}
fn("fnName");     //fnName

call/apply/bind要领的挪用

这三个要领都是经由过程通报参数转变函数体内的this。call和apply要领的作用雷同,函数体内的this指向的第一个参数。

var name = "window";
var o = {
    name: "object"
};

function fn(){
    alert(this.name)
}

fn.call(this);  //window
fn.call(window);  //window
fn.call(o);       //object
var obj1 = {
    n1:"n1",
    n2:"n2"
};
var obj2 = {
    n1:"nn1",
    n2:"nn2",
    fn:function(x,y){
        this.n1 = x;
        this.n2 = y;
    }
};
obj2.fn.call(obj1,"new1","new2");
console.log(obj1.n1);  //  new1
console.log(obj1.n2);  //  new2
console.log(obj2.n1);  //  nn1
console.log(obj2.n2);  //  nn2

bind要领会建立一个函数的实例,其this值会被绑定到传给bind()函数的值

var obj1 = {
    n1:"n1",
    n2:"n2"
};
var obj2 = {
    n1:"nn1",
    n2:"nn2",
    fn:function(x,y){
        this.n1 = x;
        this.n2 = y;
    }
};
var obj = obj2.fn.bind(obj1);
obj("new1","new2");
console.log(obj1.n1);  //  new1
console.log(obj1.n2);  //  new2
console.log(obj2.n1);  //  nn1
console.log(obj2.n2);  //  nn2

参考资料

关注作者吧~

《javascript的this对象》

    原文作者:lynneshow
    原文地址: https://segmentfault.com/a/1190000007272823
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞