一,作为global对象
var x = 1;
function fun (){
var x =2;
console.log(this.x);
}
fun();//1
二,作为对象方法的调用
函数还可以某个对象的方法调用,这是这个this就指向这个上级对象;
var Obj ={
name:"MGT360124",
age :17,
}
function getName ( ) {
alert(this.name);
}
Obj.getName = getName;
Obj.getName();//"MGT360124"
三,作为构造函数调用
通过构造函数创建的对象实例object,这时这个this就指向这个object;
function Dog () {
this.name = "大黄";
}
var dog = new Dog();
dog.name;
js中call和apply方法:改变函数运行时的上下文,也就是说改变函数体内部this的指向
js中函数存在: 函数被定义时的上下文, 运行时的上下文,上下文的改变;
//定义一个构造函数constructor
function Dog () { }
Dog.prototype = {
name :"大黄",
color: "yellow",
say:function () {
console.log(this.color);
}
}
var dogA = new Dog();
dogA.say();//yellow
但是我们在创建一个对象,不像给这个对象添加方法,怎么去公用上面的这个方法?
var dogB = {
color :"white",
}
dogA.say.call(dogB);//white
dogA.say.apply(dogB);//white
所以可以看出call()和apply()是为了动态改变this而出现的,当一个对象没有这个方法,但是其他的构造函数有这个方法,那么可以借助call()h和apply()用其他对象的方法来操作
call()和apply的区别
他们的作用是相同的,只是传递的参数不一样
call()方法传递的参数必须直接传给函数
apply()接收两个参数:一个参数是在其中运行的作用域,一个是参数数组
var dog = function (name,color) {
this.name=name;
this.color = color;
console.log(this.name +" is "+this.color);
}
var DaHuang = { }
dog.call(DaHuang,"大黄","yellow");//大黄 is yellow
dog.apply( DaHuang, ["2哈","WhiteAndBlack"] );//2哈 is WhiteAndBlack