展开

关键词

JS 的 call apply bind

js的call apply bind 都很常见,目的都是为了改变某个的执行环境(context) call call([thisObj[,arg1[, arg2[,   [,.argN]]]]] 将被传递参数序列。 bind(thisArg [, arg1 [, arg2, …]]); bind 也是改变某个的执行环境,区别也在于第二个参数(也是一个个的参数形式)和“返回值”的特性。    如 func.call(func1,var1,var2,var3) 对应的apply写为:func.apply(func1,[var1,var2,var3]) 对应的bind为: func.bind ,1); // 返回一个新的函数 return function(){ // 将相关参数赋给这个bind所在,并将执环境赋给context return

37530

彻底理解了call(),apply()bind()

如果包含this的函数是一个对象的,this指向的就是这个对象。 这样写是有问题的 ,如果我们的变量名修改了,我们必须同时修改中的变量名。幸运的是,JavaScript给我们提供了解决这个问题的。 JavaScript给我们提供了 3 中 函数 来改变this的指向。 2.call() 这个的第一个参数表示this指向的对象,后面的所有参数都是函数的参数。 這個和call的作用都是相同的,只不过在传递参数时候,call可以传递多个参数,而apply只能传递一个,并且要求是一个数组。 () bind()第一个参数是我们希望函数中this指向的对象,后面的参数是我们希望给函数的参数绑定的值。

34320
  • 广告
    关闭

    90+款云产品免费体验

    提供包括云服务器,云数据库在内的90+款云计算产品。打造一站式的云产品试用服务,助力开发者和企业零门槛上云。

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    JavaScript中call,apply,bind的使用及原理

    在JavaScript里,call(),apply(),bind()都是Function内置的三个, 它们的作用都是显示的绑定this的指向,三个的第一个参数都是this指向的对象,也就是函数在运行时执行的上下文 当我们定义一个新的对象,需要使用其他对象的的时候,我们不需要重新开发重复的逻辑,借助apply,apply,bind三个可以实现对这些的的调用。 bind()创建一个新的函数,在bind()被调用时,这个新函数的this被bind的第一个参数指定,其余的参数将作为新函数的参数供调用时使用,第一个thisArg在setTimeout中创建一个函数时传递的原始值都会转化成 特点: apply,call,bind三个第一个参数都是函数在调用时this指向的对象,也就是运行时的上下文(this显示绑定的原理) apply,call第一个参数为空,null,undefined 当我们调用cacheName时this绑定的是window对象,所以this.name获取的是global 我们需要借助bind,在函数调用的时候,绑定this的执行到cacheFun对象上:

    40920

    面试官问:能否模拟实现JS的bind(高频考点)

    1.面试官问:能否模拟实现JS的new操作符 2.面试官问:能否模拟实现JS的bind(本文) 3.面试官问:能否模拟实现JS的call和apply 4.面试官问:JS的this指向 5.面试官问 2、传给bind()的其他参数接收处理了,bind()之后返回的函数的参数也接收处理了,也就是说合并处理了。 3、并且bind()后的name为bound + 空格 + 调用bind的函数名。 if(self.prototype){ // ES5 提供的案 Object.create() // bound.prototype = // 所以采用 MDN ployfill案 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects = 0; i < boundLength; i++) { array_push.call(boundArgs, '$' + i); } // 这里是Function构造式生成形参

    12520

    functional 和 bind

    使用 functional 和 bind 就可以简单绑定类成员函数参数,且能指定对象。 成员函数必须用 & 来获取地址,非成员就不需要,便记,就统一加 & 好了。 void TestCall2(TestCallback2 cb) { cb(45); } int main() { funClass f; // 调用绑定,成员函数的,就 bind ( 函数名,对象指针,args...); TestCallback cb1 = bind(&funClass::fun, &f, 10); TestCall(cb1); // 对于非成员函数的,就 bind( 函数名,args...); TestCallback cb2 = bind(¬ClassNumber, 20); TestCall(cb2); // 对于参数不绑定的 TestCallback2 cb3 = bind(¬ClassNumber, _1); TestCall2(cb3); system("pause

    15741

    使用 bind 设置 DNS 服务器的

    包: $ sudo dnf install bind bind-utils -y bind 包提供了 /etc/named.conf 配置文件,来供你配置 DNS 服务器。 在 /etc/named.conf 文件的底部查找以下行: include "/etc/named.rfc1912.zones"; 在此处,你将在该行的正上指定区域文件信息,如下所示: zone "dns01 所有粗体(LCTT 译注:本译文中无呈现粗体)内容都特定于你的环境。保存文件并退出。 你还需要配置 SELinux 并为配置文件添加正确的所有权。 安装 bind 程序: $ sudo dnf install bind-utils -y 编辑 /etc/resolv.conf 文件,并将主 DNS 配置为唯一的名称服务器: $ sudo vi DNS应急 (2)为内网网站提供内线的IP地址解析,或者实现双线解析 (3)当你的ISP限制了二级域名和高级管理特性,你需要自己搭建DNS服务器来满足自己的需要 (4)避免DNS劫持 (5)和别的解决案集成

    42641

    C++11 std::bind std::function 高级使用

    placeholders::_2, 100); std::cout << "add100(1, 2) = " << add100(1, 2) << std::endl; // 注意:无<em>法</em>使用 sumFn(1, 2, 3) : 6 ————————— 上面的样例很有趣,使用了2种<em>方</em>案。将一个函数,注冊到一个对象/仿函数中,而且通过一个对象/仿函数来直接调用调用。 样例显而易见的。 第2种<em>方</em>案更佳简洁,而且对传递參数有明白的推断,当參数类型或数量不对的时候,编译器将导致失败。 无<em>法</em>直接调用脚本函数类。 有了好的解决的<em>方</em><em>法</em>。这个我将随后补充。 #include <list> #include <functional> template<typename...

    12620

    JavaScript 中 call()、apply()、bind() 的用

    ; // 17 比较一下这两者 this 的差别,第一个打印里面的 this 指向 obj,第二个全局声明的 shows() 函数 this 是 window ; 1,call()、apply()、bind 后面多了个 () 外 ,结果返回都一致! 由此得出结论,bind 返回的是一个新的函数,你必须调用它才会被执行。 2,对比call 、bind 、 apply 传参情况下 ? 从上面四个结果不难看出: call 、bind 、 apply 这三个函数的第一个参数都是 this 的指向对象,第二个参数差别就来了: call 的参数是直接放进去的,第二第三第 n 个参数全都用逗号分隔 bind 除了返回是函数以外,它 的参数和 call 一样。 当然,三者的参数不限定是 string 类型,允许是各种类型,包括函数 、 object 等等!

    22030

    JavaScript 中 call()、apply()、bind() 的用

    在JavaScript 中,call、apply 和 bind 是 Function 对象自带的三个,这三个的主要作用是改变函数调用过程中的 this 指向 1 apply Function.apply (obj,args) apply接收两个参数 obj:这个对象将代替Function类里this对象 args:这个是数组,它将作为参数传给Function(args-->arguments) call接收两个参数 obj:这个对象将代替Function类里this对象 args:这个是一个参数列表 不带第一个参数 var person = { fullName: function Function.bind(obj[,params...]) bind是ES5 新增的一个,它的传参和call类似,也是接收两个参数。 那为什么要引入bind呢,是因为call和apply会自动执行目标函数,从而无绑定在事件上,因为事件是我们手动触发的,而bind不会自动执行目标函数。

    1491110

    JS中call apply bind的用

    谁调用当前的属性或者的,它就是谁 /* 2.1.bind作用 修改函数或者中的this为指定的对象, 并且会返回一个修改之后的新函数给我们 注意点 : bind除了可以修改this以外, 还可以传递参数, 只不过参数必须写在this对象的后面 */ //call apply bind修改this的 /*call:修改函数或者中的this为指定的对象, 并且会立即调用修改之后的函数 注意点: call除了可以修改this以外, 还可以传递参数, */ /*apply:修改函数或者中的this为指定的对象, 并且会立即调用修改之后的函数 注意点: apply除了可以修改this以外, 还可以传递参数, 只不过参数必须通过数组的式传递

    18930

    js call()、apply()、bind()用和区别

    1. call() 语: fun.call(thisArg,arg1,arg2,…) fun: 表示一个函数 thisArg: this要指向的对象,如果是null 和 undefined,则指向window 特性: fun.call(thisArg,arg1,arg2,…) 会立即调用fun函数; call 将一个函数的对象上下文从初始的上下文改变为由 thisArg 指定的新对象,如果没有提供 thisArg return num1 + num2; } const obj = {}; getSum.call(obj, 2, 3); // this指向: obj return: 5 2. apply() 语: 特性: fun.apply(thisArg,[arg1,arg2,…]) 会立即调用fun函数; apply将一个函数的对象上下文从初始的上下文改变为由 thisArg 指定的新对象,如果没有提供 特性: fun.bind(thisArg,arg1,arg2,…) 不会立即调用fun函数,会返回一个新的指定了this的函数; bind将一个函数的对象上下文从初始的上下文改变为由 thisArg

    5130

    : std::bind

    在上一篇文章中,我们提到可调用对象(callable object),其中一种就是std::bind表达式。在这篇文章中,我们来谈谈std::bind表达式。 但我们可以想象一下加入上面的add函数实现了很复杂的逻辑,通过copy代码的式实现类似功能,极其容易引入bug。 易于维护,这其实也是代码复用带来的好处,代码逻辑写在一处比分散在多处更容易维护。 如果说这两点好处还不足以说服我们使用std::bind,那接下来我们要探讨的用才是std::bind的最大用途。 在上一篇文章中,我们曾提过对象的成员函数无与函数指针相容,主要原因在于类的成员函数都包含有一个隐含的this参数。 当然,在实际项目的代码中,还有很多bind的用途,比如chromium项目中就有大量的bind和callback,虽然里面并不是使用的std::bind,而是使用自己定义的base::bind,但在原理上是差不多的

    22860

    vue v-bind

    15420

    call、apply、bind

    今天分享自己对于call、apply、bind新的认识,并手写一个自己的call、apply、bind。 三个的语大体一样: fnction fn() {} fn.call(thisArg, arg1, arg2, ...) fn.apply(thisArg, [arg1,arg2,...]) fn.bind 是挂在Function对象上的,只有函数才能调用。 说真的,这三个开发业务的时候并不常用,有用也是用来装一装,面面试。三个最主要的就是借助别人的,减少重复代码,节省内存。 比如fn1和fn2,fn2需要用到fn1的,这时候直接用fn1的而不是自己声明一个bind比较不一样,bind返回的是一个函数,所以还可以用来做闭包等。

    17220

    apply()、call()、bind()

    apply()、call()、bind() 每个Function对象都存在apply()、call()、bind(),其作用都是可以在特定的作用域中调用函数,等于设置函数体内this对象的值,以扩充函数赖以运行的作用域 使用 apply()、call()、bind()都能改变函数对象的this指向 window.name = "A"; //挂载到window对象的name document.name = "B"; // window对象 rollCall.sayName.call(document); //B //绑定document对象 rollCall.sayName.call(s); //C //绑定自定义对象 // bind ()都能够达到改变this指针的目的,但是其使用还是有区别的 // apply与call传参式不同 window.name = "Teacher"; var rollCall = { sayAllName 仅将对象绑定,并不立即执行,其返回值是一个函数,传参式与 call 相同 var convertThis = rollCall.sayAllName.bind(window,"A","B","C")

    13220

    JavaScript中apply、call、bind的区别与用

    apply()、call()和bind()都是Function.prototype对象中的,而所有的函数都是Function的实例。三者都可以改变this的指向,将函数绑定到上下文中。 1. 语: fun.call(thisArg, arg1, arg2, ...) 1.3 Function.prototype.bind() bind()创建一个新的函数, 当被调用时,将其this关键字设置为提供的值 2.2 call 与apply的用 ? 结果相同,call()和apply(),第一个参数都是要绑定上下文,后面的参数是要传递给调用该的函数的。 2.3 bind()的用 ? bind传递给调用函数的参数可以逐个列出,也可以写在数组中。bind与call、apply最大的不同就是前者返回一个绑定上下文的函数,而后两者是直接执行了函数。 总结bind()的用:该创建一个新函数,称为绑定函数,绑定函数会以创建它时传入bind()的第一个参数作为this,传入bind()的第二个以及以后的参数加上绑定函数运行时本身的参数按照顺序作为原函数的参数来调用原函数

    30320

    vue之v-bind绑定style(对象语

    对象语案例: <! 数组语案例: <!

    15810

    BindException: Cannot assign requested address (Bind failed)解决办

    $Listener@763] - Exception while listening java.net.BindException: Cannot assign requested address (Bind at org.apache.zookeeper.server.quorum.QuorumCnxManager$Listener.run(QuorumCnxManager.java:742) 2、解决办 百度了BindException: Cannot assign requested address (Bind failed),网友们提供的不能解决我的遇到的问题。

    6030

    相关产品

    • 小程序安全

      小程序安全

      小程序安全针对小程序不同业务场景提供包括小程序安全加固、小程序安全扫描、小程序渗透测试功能,通过分析仿冒程序,挖掘风险漏洞、保护核心代码等方法保护小程序业务安全、数据安全,降低客户业务风险和资金损失。

    相关资讯

    热门标签

    扫码关注云+社区

    领取腾讯云代金券