- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
看了本文您能了解到的知识! 。
在本篇文章中,将带你了解 什么是bind , bind的用途 、 如何手写bind 以及 工作中实际使用bind的场景 .
在JavaScript中, bind() 方法是用来 创建一个新函数 ,并将其 绑定到指定的对象 上,从而在调用该函数时确保函数中的 this 关键字指向绑定的对象.
bind() 方法 创建一个新的函数 ,在bind()被调用时,这个新函数的 this 被指定 bind() 的第一个参数,而其余参数将作为新函数的参数,供调用时使用.
MDN文档 : Function.prototype.bind() 。
语法:
function.bind(thisArg[, arg1[, arg2[, ...]]])
参数:
thisArg :被绑定到函数上的对象,即当调用绑定后的函数时,函数中的 this 关键字会指向该对象。如果 thisArg 参数为 null 或 undefined ,则 this 关键字将指向全局对象(在浏览器中通常是 window 对象).
arg1, arg2, ... :要传递给函数的参数。这些参数将按照顺序传递给函数,并在调用函数时作为函数参数使用.
返回值:
返回一个 原函数的拷贝 ,并拥有指定的 this 值和初始参数.
代码:
this.name = 'guizimo'
let obj = {
name: 'zimo',
getName: function() {return this.name}
}
console.log(obj.getName()) // zimo
let newGetName = obj.getName
console.log(newGetName()) // guizimo
let bindGetName = newGetName.bind(obj)
console.log(bindGetName()) // zimo
简述代码:
第一次打印 zimo ,可以理解为是打印对象内的一个属性,此时的 this 是指向 obj对象 .
第二次打印 guizimo ,因为当前环境是对象外,因为当前执行的函数是 newGetName() ,因此函数内部的 this 指向全局对象.
通过 bind 生成一个 新的拷贝函数 ,当前执行的函数 bindGetName() 的 this 指向 obj对象 .
这是面试官最喜欢的环节了 。
思路:
bind()
方法返回一个新函数,因此需要定义一个函数来返回新函数。 apply()
或 call()
方法来调用原始函数并传递正确的 this
值和参数。 thisArg
参数来指定要绑定的对象,并可以接受任意数量的其他参数。 代码:
/**
* 手写bind
* @returns {function(): any}
*/
Function.prototype.myBind = function () {
// 处理函数
let args = Array.from(arguments);
let thisArg = args.shift();
// 暂存this
let thisFunc = this;
// 因为需要构造函数,所以不能是匿名函数了
const fBound = function () {
const newArgs = args.concat(Array.from(arguments));
// 判断是否为构造函数
thisArg = this instanceof fBound ? this : thisArg;
return thisFunc.apply(thisArg, newArgs);
}
// 直接将原函数的prototype赋值给绑定函数
fBound.prototype = this.prototype;
// 返回
return fBound;
}
简述代码:
Array.from()
将 arguments
转化为数组对象,通过 shift()
取出 thisArg
。 thisFunc
暂存当前函数的 this
。 fBound
, newArgs
接收合并处理的 arguments
。 fBound
是否为构造函数,如果是构造函数,返回闭包的 this
,反之,返回外部拿到的 thisArg
,使用 thisArg
来接收。 thisFunc.apply
传递 thisArg
值和参数 newArgs
。 prototype
赋值给 fBound
。 fBound
。 这是 bind 最基本的一种使用方式了,也就是 创建一个新的函数 .
代码:
this.name = 'guizimo'
let obj = {
name: 'zimo',
getName: function() {return this.name}
}
console.log(obj.getName()) // zimo
let newGetName = obj.getName
console.log(newGetName()) // guizimo
let bindGetName = newGetName.bind(obj)
console.log(bindGetName()) // zimo
简述代码:
zimo
,可以理解为是打印对象内的一个属性,此时的 this
是指向 obj对象
。 guizimo
,因为当前环境是对象外,因为当前执行的函数是 newGetName()
,因此函数内部的 this
指向全局对象。 bind
生成一个 新的拷贝函数 ,当前执行的函数 bindGetName()
的 this
指向 obj对象
。 如果需要创建一个自定义函数,需要固定部分参数,那么 bind 就有它独特的作用了 。
代码:
function add (a, b) {
return a + b
}
const res1 = add(1, 2)
console.log(res1) // 3
// 创建一个偏函数,将1作为预设的参数
const addP = add.bind(null, 1)
const res2 = addP(2)
console.log(res2) // 3
const res3 = addP(3)
console.log(res3) // 4
const res4 = addP(4)
console.log(res4) // 5
简述代码:
add
函数,调用 add(1, 2)
,正常打印 3
。 addP
,将1作为预设的参数,调用 addP(2)
,也可以正常打印 3
,后续调用 addP(3)
、 addp(4)
,皆打印正确的数值, 实现了对一个参数的固定 。 在 JSX 中传递的事件不是一个字符串,而是一个函数(如: onClick={this.handleClick} ),此时 onClick 即是中间变量,所以处理函数中的 this指向 会丢失.
代码:
<button onClick={this.handleClick.bind(this)}>点击</button>
//此时this指向是当前实例对象
handleAdd = () => {
console.log(this)
this.setState({
...
})
}
解决这个问题就是给调用函数时 bind(this) ,从而使得无论事件处理函数如何传递, this指向 都是当前实例化对象。或者 使用箭头函数声明一个函数 ,这样函数内的 this 也是指向当前实例.
在JavaScript中,需要在事件处理程序中访问事件目标的 this 值。在这种情况下,可以使用 bind() 方法将事件处理程序绑定到事件目标上,以便在调用事件处理程序时, this 关键字始终指向事件目标.
代码:
const button = document.querySelector('#myButton');
button.addEventListener('click', function() {
// 在这里可以使用 this 访问按钮元素的属性和方法
}.bind(button));
文章所涉及的部分资料来自互联网整理,其中包含自己个人的总结和看法,分享的目的在于共建社区和巩固自己.
引用的资料如有侵权,请联系本人删除! 。
感谢勤劳的 自己 , 个人博客 , GitHub ,公众号 【归子莫】 ,小程序 【子莫说】 。
如果你感觉对你有帮助的话,不妨给我点赞鼓励一下,好文记得收藏哟! 。
幸好我在,感谢你来! 。
最后此篇关于【JavaScript】你真的熟悉bind吗的文章就讲到这里了,如果你想了解更多关于【JavaScript】你真的熟悉bind吗的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我不知道该怎么做... function f1() { var x = 10; function f2(fx) { var x; x = 6;
早期绑定(bind)和后期绑定(bind)有什么区别? 最佳答案 简短的回答是,早期(或静态)绑定(bind)是指编译时绑定(bind),后期(或动态)绑定(bind)是指运行时绑定(bind)(例如
如何在 SwiftUI View 上使用 Binding(get: { }, set: { }) 自定义绑定(bind)与 @Binding 属性。我已成功使用此自定义绑定(bind)与 @State
我经常发现自己遇到问题,即控件的两个(相关)值被更新,并且两者都会触发昂贵的操作,或者控件可能会暂时处于不一致的状态。 例如,考虑一个数据绑定(bind),其中两个值 (x,y) 相互减去,最终结果用
我想通过我的 ViewModel 控制我的一个窗口的高度和宽度。 这看起来很简单。 但没有。它不起作用。 它检查 ViewModel 的 Width但不是 Height . 奇怪的是,如果我切换 W
UI5中一次性绑定(bind)和单向绑定(bind)有什么区别? 是否有任何用户特定的用例我会使用它们? 我无法从文档中获得太多信息。 最佳答案 单程 它的作用:单向数据流。模型数据的变化(例如通过
(define make (lambda (x) (lambda (y) (cons x (list y))))) (let ((x 7) (p (make 4))) (cons
尽管我或多或少地了解什么是语言绑定(bind),但我很难理解它们是如何工作的。 例如,谁能解释一下如何为 WinAPI 制作 Java 绑定(bind)? 最佳答案 如果您搜索 Foreign Fun
谁能解释为什么我可以重新绑定(bind)列表但不能+? (binding [list vector] (list 1 3)) (binding [list +] (list 1 3)) (bi
我真的很喜欢 Caliburn 和命名约定绑定(bind),我很惊讶 可见性与“CanNAME”约定用于保护 Action 的方式不同。 据我所知, BooleanToVisibilityConver
我了解动态绑定(bind)的实现方式以及静态绑定(bind)和动态绑定(bind)之间的区别,但我只是无法理解动态绑定(bind)的定义。基本上它是一种运行时绑定(bind)类型。 最佳答案 基本上,
http://jsfiddle.net/3NRsd/ var foo = $("div").bind("click", function() { $("div").animate({"hei
这个问题我快疯了...我有一个用户控件,它有一个用于插入操作的 FormView 和一个用于所有其他操作的 GridView。 在这两个控件中,我都有一个 DropDownList,如下所示: '
我有一个绑定(bind)到 ListBox 的地址的 ObservableCollection。然后在 ItemTemplate 中,我使用 {Binding .} 绑定(bind)到当前地址记录。这
如果我有以下简单的 js/knockout 代码: .js( View 模型): var image = ko.observable('http://placehold.it/300x150'); 看
我正在 aurelia 上开发一个自定义属性,让用户在输入文本区域时从列表中进行选择。例如,用法将是这样的: 正如您可能注意到的,auto-complete是属性。现在,当我想显示提示时,我想在自定
我正在使用 EventEmitter2作为我的应用程序内部的消息总线。现在我需要绑定(bind)和取消绑定(bind)一些事件处理程序。因为我也希望他们bind将它们添加到给定的上下文中,我最终得到以
我有以下函数调用: $(".selector").on("click", callback.bind(this, param1, param2)); 在我的回调函数中,我想使用绑定(bind)的 th
我目前正在试验新的编译绑定(bind),并且(再次)达到了我在拼图中遗漏了一个小问题:为什么我必须调用 Bindings.Update?直到现在,我还认为实现 INotifyPropertyChang
我正在阅读一本关于编写 JavaScript 框架的书,并找到了这段代码。但是我不明白它是如何工作的,尤其是 bind.bind 的用法?有人知道吗? var bind = Function.prot
我是一名优秀的程序员,十分优秀!