前言
bind()接受无数个参数,第一个参数是它生成的新函数的this指向,比如我传个window,不管它在何处调用,这个新函数中的this就指向window,这个新函数的参数就是bind()的第二个、第三个、第四个....第n个参数加上它原本的参数。(行吧,我自己都蒙圈了)
示例介绍
我们还是看看栗子比较好理解,举个bind()最基本的使用方法:
this.x = 9; var module = { x: 81, getX: function() { return this.x; } }; module.getX(); // 返回 81 var retrieveX = module.getX; retrieveX(); // 返回 9, 在这种情况下,"this"指向全局作用域 // 创建一个新函数,将"this"绑定到module对象 // 新手可能会被全局的x变量和module里的属性x所迷惑 var boundGetX = retrieveX.bind(module); boundGetX(); // 返回 81
这里很明显,我们在window对象下调用retrieveX,得到的结果肯定是window下的x,我们把module对象绑定到retrieveX的this上,问题就解决了,不管它在何处调用,this都是指向module对象。
还有bind()的其他参数,相信第一次接触bind()的朋友看到上面的定义都会蒙圈。
还是举个栗子:
function list() { return Array.prototype.slice.call(arguments); } var list1 = list(1, 2, 3); // [1, 2, 3] // 创建一个拥有预设初始参数的函数 var leadingThirtysevenList = list.bind(undefined,[69,37],{a:2}); var list2 = leadingThirtysevenList(); // [[69,37],{a:2}] var list3 = leadingThirtysevenList(1, 2, 3); // [[69,37],{a:2}, 1, 2, 3]
list函数很简单,把传入的每个参数插入到一个数组里,我们用bind()给list函数设置初始值,因为不用改变list中this的指向,所以直接传undefined,从第二个参数开始,就是要传入list函数的值,list2和list3的返回值很好的说明了一切。
我自己一般使用的bind()的场景是配合setTimeout函数,因为在执行setTimeout时,this会默认指向window对象,在使用bind()之前,我是这么做的:
function Coder(name) { var that = this; that.name = name; that.getName = function() { console.log(that.name) }; that.delayGetName = function() { setTimeout(that.getName,1000) }; } var me = new Coder('Jins') me.delayGetName()//延迟一秒输出Jins
在函数内顶层定义一个that缓存this的指针,这样不论怎么调用,that都是指向 Coder的html" target="_blank">实例,但是多定义一个变量总是让人不太舒服。
使用bind()就简单多了:
function Coder(name) { this.name = name; this.getName = function() { console.log(this.name) }; this.delayGetName = function() { setTimeout(this.getName.bind(this),1000) }; } var me = new Coder('Jins') me.delayGetName()//延迟一秒输出Jins
这样就OK了,直接把setTimeout的this绑定到外层的this,这肯定是我们想要的!
最后附上参考地址:
Function.prototype.bind()
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对小牛知识库的支持。
在设计回调函数的时候,无可避免地会接触到可回调对象。在C++11中,提供了std::function和std::bind两个方法来对可回调对象进行统一和封装。 可调用对象 C++中有如下几种可调用对象:函数、函数指针、lambda表达式、bind对象、函数对象。其中,lambda表达式和bind对象是C++11标准中提出的(bind机制并不是新标准中首次提出,而是对旧版本中bind1st和bind
标准库函数bind()和function()定义于头文件<functional>中(该头文件还包括许多其他函数对象),用于处理函数及函数参数。bind()接受一个函数(或者函数对象,或者任何你可以通过”(…)”符号调用的事物),生成一个其有某一个或多个函数参数被“绑定”或重新组织的函数对象。(译注:顾名思义,bind()函数的意义就像它的函数名一样,是用来绑定函数调用的某些参数的。)例如: int
但是,我搞错了: **(退出#pid<0.70.0>)退出于:genserver.call(MySupervisor,{:start_child,[#pid<0.70.0>,:Monitor,{:nonode@nohost,#pid<0.81.0>},{:erlang,:apply,[#function<0.118488666 in file:test.exs>,[“long st ring”]]
本文向大家介绍关于C++对象继承中的内存布局示例详解,包括了关于C++对象继承中的内存布局示例详解的使用技巧和注意事项,需要的朋友参考一下 前言 本文给大家介绍的是关于C++对象继承的内存布局的相关内容,分享出来供大家参考学习,在开始之前说明下,关于单继承和多继承的简单概念可参考此文章 以下编译环境均为:WIN32+VS2015 虚函数表 对C++ 了解的人都应该知道虚函数(Virtual Fun
我正在测试
本文向大家介绍JavaScript中Function详解,包括了JavaScript中Function详解的使用技巧和注意事项,需要的朋友参考一下 关键字function用来定义函数。 注意,function语句里的花括号是必需的,即使函数体只包含一条语句。 在JavaScript中,函数是Function类的具体实例。而且都与其它引用类型一样具有属性和方法。 函数名实际上是指向函数对象的指针,函