javascript:this

关于this

this是函数内部的一个特别对象,this援用的是函数据以实行的环境对象,在挪用函数前this的值并不肯定,差别的挪用体式格局会致使this值的转变。
可连系这篇文章明白环境对象的观点

window.num = 22;
var o = {num: 11};
function sayNum(){
    alert(this.num)
}
sayNum();//22
o.sayNum = sayNum;
o.sayNum();//11

记着函数名仅仅是一个包括指针的变量罢了。因而即使是在差别的环境中实行,全局的sayNum()函数与o.sayNum()指向的仍然是同一个函数。

1.全局作用域中挪用函数时

全局作用域中挪用,this对象援用的是window
匿名函数的实行具有全局性,因而其this对象一般也指向window

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

fn1();

2.经由过程new操作符挪用

this援用的是实例对象

function Person(name){
    this.name = name;
}
Person.prototype.printName = function(){
    alert(this.name);//Byron
};

var p1 = new Person('Byron');

3.作为对象的要领挪用

this援用的是该对象

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

obj1.fn();

4.间接挪用

call和apply

每一个函数都包括两个非继续而来的要领:call()和apply()。这两个要领的用处都是在特定的作用域中挪用函数,实际上即是设置函数体内this对象的值。也就是说,直接挪用函数,挪用时指定实行环境是谁

window.color = 'red';
var o = {color: 'blue'};
function sayColor(){
    alert(this.color);
}
sayColor.call(this);//red
sayColor.call(window);//red
sayColor.call(o);//blue

1.apply要领

吸收两个参数,一个是在函数中运转函数的作用域,另一个是参数数组

2.call要领

call要领与apply要领雷同,区分在于吸收参数的体式格局差别,关于call要领而言,第一个参数是this值没有变化,变化的是其他参数都直接传递给函数。

function fn(){
     console.log(this)//windwow
     function InnerFn(){
          console.log(this)
     }
     InnerFn.call(this)//window
}
fn();
  function fn0(){
     console.log(this)//window
}
function fn1(){
     fn0.call(this);
     console.log(this);//window
}
fn1();
function fn0(){
 console.log(this)//object
}
var o = {
    fn1: function fn1(){
        fn0.call(this);
        console.log(this);//object
    }
}
o.fn1();   

bind要领

这个要领会建立一个函数的实例,其this值会被绑定到传给bind()函数的值。也就是说会返回一个新函数,而且使函数内部的this为传入的第一个参数

window.color = 'red';
var o = {color : 'blue'};
function sayColor(){
    alert(this.color)
}
var objectSayColor = sayColor.bind(o);
objectSayColor();//blue
    原文作者:Murphywuwu
    原文地址: https://segmentfault.com/a/1190000003940664
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞