首页 > 其他分享 >使用call、apply和bind改变函数执行时的上下文

使用call、apply和bind改变函数执行时的上下文

时间:2024-09-18 16:45:31浏览次数:10  
标签:obj bind sum alert call apply

使用call、apply和bind都能够是函数的上下文发生改变,那我们来具体看看这记者之间的区别吧。

call方法:

语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]])

定义:调用一个对象的一个方法,以另一个对象替换当前对象。

说明:call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。

     如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

apply方法:

语法:apply([thisObj[,argArray]])

定义:应用某一对象的一个方法,用另一个对象替换当前对象。

说明:如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。

        如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。

bind方法:

语法:bind(thisArg[, arg1[, arg2[, ...]]])

定义:将接受多个参数的函数变换成接受一个单一参数。

说明:bind()方法所返回的函数的length(形参数量)等于原函数的形参数量减去传入bind()方法中的实参数量(第一个参数以后的所有参数),因为传入bind中的实参都会绑定到原函数的形参。

哎呀妈呀,讲了那么多理论的东西,我都晕了,还是看看实际的例子:

复制代码
var test = {
    a : 5,
    b : 6,
    sum : function (a,b) {
        var self = this;
        function getA() {
            return self.a;
        }
        function getB(){
            return self.b;
        }
        alert(a);
        alert(b);
        return getA() + getB();
    }
}
var obj = {a:2,b:3};
alert(test.sum.call(obj,4,5));      // 调用时self = this = obj,alert顺序4,5,5
alert(test.sum.apply(obj,[6,7]));   // 调用时self = this = obj,alert顺序6,7,5
var sum = test.sum.bind(obj,8);     // 此处返回一个只有一个参数的函数sum(b)
alert(sum(9));                      // 调用时self = this = obj,alert顺序8,9,5
复制代码

从上面的例子我们可以很清晰的看到call、apply和bind之间的区别。其中call和apply是差不多的,只是传参的形势不同(apply的第二个参数为一个数组或arguments),他们都是直接直接执行函数;

而bind函数将test.sum简化为另一个全局函数sum(b),sum(b)只需要传入一个参数即可。

标签:obj,bind,sum,alert,call,apply
From: https://www.cnblogs.com/fly-s/p/18418846

相关文章

  • ZBLOG PHP提示"Call to undefined function mysql_connect()"错误
    当遇到Z-BlogPHP在PHP7.2上出现 mysql_connect() 未定义的错误时,这是因为PHP7.2默认不再支持MySQL扩展(mysql 扩展)。你需要进行一些调整来使Z-BlogPHP兼容PHP7.2。以下是两种解决方案:解决方案一:降级PHP版本如果你暂时不想修改代码,可以选择降级PHP版本到一......
  • zblogPHP后台在线升级后提示Call to undefined function Redirect_cmd_end()错误
    当Z-BlogPHP在线升级后提示“CalltoundefinedfunctionRedirect_cmd_end()”错误时,这通常是因为升级过程中某些文件没有正确更新或存在兼容性问题。以下是一些可能的解决步骤:1.检查函数定义问题描述:Redirect_cmd_end() 函数可能未被定义。解决方法:打开Z-BlogPHP......
  • Call to undefined function think\exception\config()
    错误信息 Calltoundefinedfunctionthink\exception\config() 表示在ThinkPHP框架中调用了未定义的函数 think\exception\config()。这通常是由于以下几个原因造成的:命名空间问题:可能是命名空间声明不正确或导入了错误的类。配置文件问题:可能是配置文件未正确加载或存在......
  • JavaScript-apply、bind、call
    call、apply、bind作用是改变函数执行时的上下文,简而言之就是改变函数运行时的this指向区别 applyapply接受两个参数,第一个参数是this的指向,第二个参数是函数接受的参数,以数组的形式传改变this指向后原函数会立即执行,且此方法只是临时改变this指向一次当第一个参数......
  • 题解 [ABC371G] Lexicographically Smallest Permutation(中文/English)
    本题解提供英文版,位于示例代码之后。Englishversionofthiseditorialisprovidedafterthesamplecode.官方题解竟然用Python来算高精度lcm,我来提供一个可以避免一切大整数运算的方法。考察\(u\getsP_u\)这张图的每个置换环。为了使答案字典序最小,显然需要从前往后......
  • WPF datagrid contextmenu menuitem commandparameter CommandParameter="{Binding R
    Install-packagenewtonsoft.json  <DataGrid.ContextMenu><ContextMenu><MenuItemHeader="ExportSelected"Command="{BindingExportSelectedCmd}"CommandParameter="{BindingRelativeSource={Relat......
  • WPF Datagrid DataGridTemplateColumn.CellTemplate local:ImageTextblock ImgUrl="{
    DataGridTemplate.CellTemplatecontainsonedatatemplaewilldisplaythecustomoizedcontrol,thekeylocatedatthecustomcontrol'sdependencypropertybindingandrelativesourceofx:typedatagridrow<local:ImageTextblockImgUrl="{Binding......
  • 全网最适合入门的面向对象编程教程:47 Python函数方法与接口-回调函数Callback
    全网最适合入门的面向对象编程教程:47Python函数方法与接口-回调函数Callback摘要:回调函数是编程中一种非常常见的模式,用于将函数作为参数传递给其他函数或方法。这种模式在Python中广泛应用于事件处理、异步编程、函数式编程等场景。原文链接:FreakStudio的博客往......
  • 记录一次因升级父依赖版本,无意引入InitBinder 导致String入参被转换为null的问题
    由于项目是前后端不分离的项目,很多接口都是通过jquery表单提交参数到后端的,有些没有对传入参数判空,导致出现空指针等系列的问题具体排查思路:检查浏览器请求的参数,是否包含该字段,具体是在F12检查具体请求里面有这个被转换为null的字段接口debug后端接口,检查参数是否接受正常......
  • C 语言内存管理语法全解析(malloc、calloc、free)
    目录一、引言二、动态内存分配1.malloc函数2.calloc函数 3.realloc函数 三、内存释放 1.free函数 2.内存泄漏的避免四、内存管理的最佳实践1.检查内存分配的返回值2.避免内存访问越界  3.释放内存的顺序4.使用内存管理工具五、总结 一、引言   ......