this的指针作用域总结
- 在全局执行环境中使用this,表示Global对象,在浏览器中就是window对象。
console.log(this); //Window
console.log(typeof this); //object
console.log(this === window); //true
- 当在函数执行环境中使用this时,情况就有些复杂了。
如果函数没有明显的作为非window对象的属性,而只是定义了函数,不管这个函数是不是定义在另一个函数中,这个函数中的this仍然表示window对象。
如果函数显示地作为一个非window对象的属性,那么函数中的this就代表这个对象.
function a() {
function b(){
console.log(this); // Window
console.log(typeof this); // object
console.log(this === window); // true
}
b();
}
a();
var obj = {
name:'nianyuyu',
show:function(){
console.log(this); //{name: "nianyuyu", show: ƒ}
console.log(typeof this); //object
console.log(this === window); //false
}
}
obj.show();
- 当通过new运算符来调用函数时,函数被当做一个构造函数,this指向构造函数创建出来的对象。
var name = "windows";
function a() {
console.log(this.name);
}
a(); // windows
var obj = new a(); // undefined
修改this的作用域关键字:call
Function.prototype.call()
可知它是Function原型的一个方法,它本身会调用另外一个函数,并接收指定的this值和参数列表。也可以理解为,call()方法中接收的对象调用当前对象所拥有的函数,而返回值则是该调用方法的返回值。
fun.call(thisObj, arg1, arg2, …)
以上,会将fun的上下文对象this修改为thisObj,并将可选参数arg1,arg2等当作参数传递给fun函数。
var student = {
name:'',
getStr:function(desc1,desc2){
console.log(desc1 + desc2 + this.name);
}
}
var xiaoming = {
name:'xiao ming'
}
student.getStr.call(xiaoming,"hello ","my name is ");
修改this的作用域关键字:apply
Function.prototype.apply()
应该说apply方法跟call方法的作用类似,只是apply接收的参数是指定的this值和一个包含多个参数的数组作为参数列表,而call是接受若干个参数的列表。
fun.apply(thisObj, [argsArray])
注意,argsArray是一个数组或者类数组对象。
var student = {
name:'',
getStr: function(desc1,desc2){
console.log(desc1 + desc2 + this.name);
console.log(this) // {name: "xiao ming"}
}
}
var xiaoming = {
name:'xiao ming'
}
student.getStr.apply(xiaoming,["hello ","my name is "]);
修改this的作用域关键字:bind
Function.prototype.bind()
bind方法会创建一个新的函数,并将原函数this的值绑定为当前指定的对象,返回由指定this值和初始化参数的原函数的拷贝。
fun.bind(thisObj[, arg1[, arg2[, …]]])
即:将fun函数的this值指定为thisObj,并将参数列表arg1,arg2等传递给该函数所创建的一个新的函数。
var student = {
name:'',
getStr: function(desc1,desc2){
console.log(this) // {name: "xiao ming"}
console.log(desc1 + this.name);
}
}
var xiaoming = {
name:'xiao ming'
}
var a = student.getStr.bind(xiaoming);
a("hello","my name is "); // 传递参数,调用函数
修改this的作用域关键字:eval
apply,bind,call的比较
- 相似点
- 都是用来改变函数的this对象的指向的。
- 第一个参数都是this要指向的对象。
- 都可以利用后续参数传参。
- 不同点
- call和apply都是对函数的直接调用,而bind方法返回的仍然是一个函数,因此后面还需要()来进行调用才可以。
- call后面的参数与方法中的参数是一一对应的。而apply的第二个参数是一个数组,数组中的元素是和方法中的参数一一对应的。bind的参数可以等调用函数的时候传递。