关于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