2016-10-12 13:53发布
请问下,什么时候使用这两个调用函数?这两个的区别,以及分别什么情况下使用?
使用 call() 或 apply() 来扩充作用域的最大好处,就是对象不需要与方法有任何耦合关系。在前面例子的第一个版本中,我们是先将 sayColor() 函数放到了对象 o 中,然后再通过 o 来调用它的;而在这里重写的例子中,就不需要先前那个多余的步骤了
call()
apply()
sayColor()
o
以上就是一个巧妙利用apply的例子. 当然你可能觉得这并没有什么卵用, 没有多提高效率. 但是想象一下, 你原本只有一个数组, 但是这个方法定义的接收的参数又不是数组的时候, 这就成了一个非常好的解决办法.具体的妙用, 还待题主自己去发现.
call() 方法与 apply() 方法的作用相同,它们的区别仅在于接收参数的方式不同。对于 call() 方法而言,第一个参数是 this 值没有变化,变化的是其余参数都直接传递给函数。换句话说,在使用 call() 方法时,传递给函数的参数必须逐个列举出来,如下面的例子所示。
this
在上面这个例子中,callSum1() 在执行 sum() 函数时传入了 this(因为是在全局作用域中调用的,所以传入的就是 window 对象)和 arguments 对象。而 callSum2 同样也调用了 sum() 函数,但它传入的则是 this 和一个参数数组。这两个函数都会正常执行并返回正确的结果。
callSum1()
sum()
window
arguments
callSum2
聪明的程序员发现, apply还有一个妙用, 就是将一个不是接收数组参数的方法, 通过apply来传递数组参数进去.比如:
在使用 call() 方法的情况下,callSum() 必须明确地传入每一个参数。结果与使用 apply() 没有什么不同。至于是使用 apply() 还是 call(),完全取决于你采取哪种给函数传递参数的方式最方便。如果你打算直接传入 arguments 对象,或者包含函数中先接收到的也是一个数组,那么使用 apply() 肯定更方便;否则,选择 call() 可能更合适。(在不给函数传递参数的情况下,使用哪个方法都无所谓。)事实上,传递参数并非 apply() 和 call() 真正的用武之地;它们真正强大的地方是能够扩充函数赖以运行的作用域。下面来看一个例子。
callSum()
如需了解更多内容,请参考:https://github.com/stone0090/...
apply和call的主要区别, apply的后一个参数是以数组的形式, 而call是列举的方式(很多个参数).至于第一个参数, 其实都差不多.这个差别就为我们何时使用call, 何时使用apply做出了明显的分界. 即参数为数组时使用apply, 非数组用call.
需要改变一个运行函数的作用域的时候进行调用,这两个区别在于接收的参数不一样apply()接收两个参数:一个是在其中运行函数的作用域,另一个是参数数组(可以是Array的实例也可是arguments对象).call()接收两个参数,第一个参数与apply参数相同,其余的参数都需要直接传递给函数,传递给函数的参数必须全部列举出来。bind()方法会创建一个函数的实例,其this值会被绑定到传给bind()函数。
这个例子是在前面说明 this 对象的示例基础上修改而成的。这一次,sayColor() 也是作为全局函数定义的,而且当在全局作用域中调用它时,它确实会显示 "red",因为对 this.color 的求值会转换成对 window.color 的求值。而 sayColor.call(this) 和 sayColor.call(window),则是两种显式地在全局作用域中调用函数的方式,结果当然都会显示 "red"。但是,当运行 sayColor.call(o) 时,函数的执行环境就不一样了,因为此时函数体内的 this 对象指向了 o,于是结果显示的是 "blue"。
"red"
this.color
window.color
sayColor.call(this)
sayColor.call(window)
sayColor.call(o)
"blue"
最多设置5个标签!
付费偷看金额在0.1-10元之间
使用
call()
或apply()
来扩充作用域的最大好处,就是对象不需要与方法有任何耦合关系。在前面例子的第一个版本中,我们是先将sayColor()
函数放到了对象o
中,然后再通过o
来调用它的;而在这里重写的例子中,就不需要先前那个多余的步骤了以上就是一个巧妙利用apply的例子.
当然你可能觉得这并没有什么卵用, 没有多提高效率. 但是想象一下, 你原本只有一个数组, 但是这个方法定义的接收的参数又不是数组的时候, 这就成了一个非常好的解决办法.
具体的妙用, 还待题主自己去发现.
call()
方法与apply()
方法的作用相同,它们的区别仅在于接收参数的方式不同。对于call()
方法而言,第一个参数是this
值没有变化,变化的是其余参数都直接传递给函数。换句话说,在使用call()
方法时,传递给函数的参数必须逐个列举出来,如下面的例子所示。在上面这个例子中,
callSum1()
在执行sum()
函数时传入了this
(因为是在全局作用域中调用的,所以传入的就是window
对象)和arguments
对象。而callSum2
同样也调用了sum()
函数,但它传入的则是this
和一个参数数组。这两个函数都会正常执行并返回正确的结果。聪明的程序员发现, apply还有一个妙用, 就是将一个不是接收数组参数的方法, 通过apply来传递数组参数进去.
比如:
在使用
call()
方法的情况下,callSum()
必须明确地传入每一个参数。结果与使用apply()
没有什么不同。至于是使用apply()
还是call()
,完全取决于你采取哪种给函数传递参数的方式最方便。如果你打算直接传入arguments
对象,或者包含函数中先接收到的也是一个数组,那么使用apply()
肯定更方便;否则,选择call()
可能更合适。(在不给函数传递参数的情况下,使用哪个方法都无所谓。)事实上,传递参数并非
apply()
和call()
真正的用武之地;它们真正强大的地方是能够扩充函数赖以运行的作用域。下面来看一个例子。如需了解更多内容,请参考:https://github.com/stone0090/...
apply和call的主要区别, apply的后一个参数是以数组的形式, 而call是列举的方式(很多个参数).至于第一个参数, 其实都差不多.
这个差别就为我们何时使用call, 何时使用apply做出了明显的分界. 即参数为数组时使用apply, 非数组用call.
需要改变一个运行函数的作用域的时候进行调用,这两个区别在于接收的参数不一样
apply()接收两个参数:一个是在其中运行函数的作用域,另一个是参数数组(可以是Array的实例也可是arguments对象).
call()接收两个参数,第一个参数与apply参数相同,其余的参数都需要直接传递给函数,传递给函数的参数必须全部列举出来。
bind()方法会创建一个函数的实例,其this值会被绑定到传给bind()函数。
这个例子是在前面说明
this
对象的示例基础上修改而成的。这一次,sayColor()
也是作为全局函数定义的,而且当在全局作用域中调用它时,它确实会显示"red"
,因为对this.color
的求值会转换成对window.color
的求值。而sayColor.call(this)
和sayColor.call(window)
,则是两种显式地在全局作用域中调用函数的方式,结果当然都会显示"red"
。但是,当运行sayColor.call(o)
时,函数的执行环境就不一样了,因为此时函数体内的this
对象指向了o
,于是结果显示的是"blue"
。一周热门 更多>