bind的机制

var foo = function(){}
var bar = foo; console.log(foo === bar) //true /*--------------------------------------*/ var foo = function(){}
var bar = function(callback1,callback2){
console.log(callback1 === callback2) //true
} bar(foo,foo) /*--------------------------------------*/ var foo = function(){}
var bar = function(){} console.log(foo === bar) //false //两个函数,不在同一内存地址中,所以返回了false

对象有属性和方法,函数也是对象的一种,我们也可以称之为函数对象,既然是对象那么就有熟悉和方法,bind就是函数对象下面的一个方法。
我们都知道对象是引用类型,引用的是内存中的一个地址,上面的callback1 === callback2这两个指针就指向了一个地址所以为true。

var foo = function(){}
var fooBind = foo.bind() console.log(foo === fooBind) // false /*--------------------------------------*/ var foo = function(){}
var fooBind = foo.bind() var bar = function(callback1,callback2){
console.log(callback1 === callback2) //false
} bar(foo,fooBind)

上面的代码中的 foo.bind()的返回值是一个新的函数,其实是将foo拷贝了一份,他们两个已经没有了任何关系,也就是说foo和fooBind已经不在同一个内存地址中了,所以返回了false。

var foo = function(){}
var fooBind1 = foo.bind()
var fooBind2 = foo.bind() console.log(fooBind1 === fooBind2) //false

虽然上面的fooBind1和fooBind2都使用了foo.bind()进行了拷贝,但他们也并没有任何关系,完全两个独立的函数。

var obj = {key:"value"}
var foo = function(){
return this;
}
var fooBind1 = foo.bind(obj)
var fooBind2 = foo.bind(obj) console.log( fooBind1() === fooBind2 () ) //true 他们都指向了同一个obj
console.log( fooBind1 === fooBind2 ) //false 他们分别是存在两个不同内存地址中的,与函数中的this无关,所以返回了false

有人就会这么想了,bind方法的主要目的是为了改变函数内的this指向,那如果我用bind方法拷贝了一个fooBind1和一个fooBind2让他们中的this都指向obj这个对象,那这fooBind1和fooBind2还在同一内存地址中吗

bind的用法

var obj = {key:"value"}
var foo = function(){
console.log(this) //obj
}.bind(obj) foo() /*--------------------------------------*/ var obj = {key:"value"}
var foo = function(){
console.log(this) //obj
} foo.bind(obj)() //也可以这样

让foo中的this指向obj。注意:foo已经并不是foo本身了,而是调用了bind之后返回的一个新的函数

var obj = {

    method:function(){

        setTimeout(function(){

            console.log(this)    //obj     注意:function(){console.log(this)}.bind(this) 返回值是一个函数

        }.bind(this),1000)
}
} obj.method() /*--------------------------------------*/ var obj = {
method:function(){ var arg = function(){
console.log(this) //obj
} var argBind = arg.bind(this) //返回来的argBind函数与arg函数完全没有任何关系。 setTimeout(argBind,1000) //与上面的写法完全相等
}
} obj.method()

简单的使用

 

最新文章

  1. NOIP模拟赛20161022
  2. wireshark常用命令
  3. Hadoop2.6.0配置参数查看小工具
  4. Linux经典书籍推荐
  5. mysql 查看当前登陆用户匹配原则及权限user()与current_user()
  6. struts2 action获取ajax提交数据中文乱码问题
  7. Head First 设计模式笔记:单例模式
  8. ab的排列 aa , ab ba,bb
  9. String类之endsWith方法--->检测该字符串以xx为结尾
  10. bootstrap-modal.js 居中问题
  11. UVa 10814 - Simplifying Fractions
  12. SQL Server--获取磁盘空间使用情况
  13. codefroces 946F Fibonacci String Subsequences
  14. hdu 5437Alisha’s Party(优先队列)
  15. 对于Dubbo的理解
  16. 一个小时学会Maven
  17. datagridview 行高列宽的自动设置
  18. r 随机数
  19. Cassandra--设置数据保留时间
  20. ios成长之每日一遍(day 7)

热门文章

  1. Python与Java异常类层级区别
  2. 《C程序设计语言》笔记(三)
  3. 【NS2】常用资源(转载)
  4. SDUT-3441_数据结构实验之二叉树二:遍历二叉树
  5. @loj - 2461@ 「2018 集训队互测 Day 1」完美的队列
  6. asp.net如何判断网址能否打开
  7. Android GDI 图形渲染
  8. Pytorch的网络结构可视化(tensorboardX)(详细)
  9. 阿里云PolarDB发布重大更新 支持Oracle等数据库一键迁移上云
  10. 模板—v-dcc缩点