javascript中的this、call、apply、bind 总结

作者: admin 日期: 2018-01-29 18:02:15 人气: - 评论: 0

在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


相关内容

发表评论
更多 网友评论0 条评论)
暂无评论

Copyright © 2012-2014 我的代码板 Inc. 保留所有权利。

页面耗时0.0188秒, 内存占用1.83 MB, 访问数据库13次

闽ICP备15009223号-1