在javascript中this是个很诡异的东西,因为在正常的面向对象范式的编程语言中(比如java中)this指的就是函数所在的对象
比如调用 foo.bar() 这个时候在bar函数里面获得的this就是指向的foo,但是由于在javascript中函数可以直接作为参数传递和赋值给其他对象(在java中函数必须放在一个对象里面再进行传递赋值调用等操作)所以情况变得复杂了
var a = {
user:"追梦子",
fn:function(){
console.log(this.user)
}
}
var b = a.fn
b() //undefined
a.fn(); //追梦子
var c={
user:"测试",
fn:null
}
c.fn=a.fn
c.fn() //测试
这里的规则还是挺奇葩的当通过a.fn的方式调用函数的时候this就是a,
通过c.fn的方式调用的时候this就是c
当通过b()的方式调用的时候其实可以看作window.b() 所以this是window,
感觉这个设定还是挺棋盘的在lisp里面是没有this这个概念的 javascript融合了lisp和面向对象的范式就变成这样了
call
调用函数,并且指定一个this,第一个参数是指定的this,后面的参数是原函数的调用参数
var a = {
text:"hello ",
fn:function(name){
console.log(this.text + name);
}
}
var b = a.fn;
b.call(a,"Tom"); //hello Tom
apply
var a = {
text:"hello ",
fn:function(name){
console.log(this.text + name);
}
}
var b = a.fn;
b.apply(a,["Tom"]); //hello Tom
apply和call功能是一样的,只是apply把原函数的调用参数全放到一个数组里面了
bind
var a = {
text:"hello ",
fn:function(name){
console.log(this.text + name);
}
}
var b = a.fn;
var c = b.bind(a)
c("Tom") //hello Tom
var d = b.bind(a,"Tom")
d() //hello Tom
bind 有点类似于函数式编程里面的函数部分施用(也叫函数局部套用),只不过这里多了指定this的功能
bind 的第一个参数为新指定的this,剩余的参数作为函数部分施用的参数
function add(a,b) {
return a+b
}
var part = add.bind(this,1)
part(2) //3