每个函数都包含apply和call方法。
相同点:都接收两个参数,一个是在其中运行函数的作用域,另一个是参数;
不同点:call方法和apply的不同之处在于接收参数的方式不同;
apply方法第二个参数可以是array的实例,也可以是arguments对象

 function test(a,b) {
return a+b;
}
function test1(a,b) {
return test.apply(this,[a,b]); //因为在全局作用域内调用,所以this指向window,传入数组
}
function test2(a,b) {
return test.apply(this,arguments); //传入arguments对象,arguments包含传入函数的所有参数
}
console.log(test1(1,1)) //
console.log(test2(1,1)) //
call方法,传递给函数的参数必须逐个列举出来

 function test3(a,b) {
return test.call(this,a,b);
}
console.log(test3(1,1)) //

它们真正强大的地方是能够扩充函数运行的作用域,改变函数体内this的指向

 window.name="is window";
var obj={
name:"is obj"
}
function app() { //定义一个全局函数
console.log(this.name); //this是指向window的
}
app(); //is window
app.call(this); //is window
app.call(window); //is window
app.call(obj); //is obj
直接调用函数打印出 is window,因为this是指向window的;app.call(this)和app.call(window)则显式地在全局作用域下调用函数的方式,也会打印出 is window;而app.call(obj),则改变了函数体内this的指向,将this指向了obj对象,所以打印出来is obj。

最新文章

  1. SQL Server索引视图以(物化视图)及索引视图与查询重写
  2. SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问
  3. 【转载】Web应用工作原理
  4. RadHat搭建内网YUM源server
  5. Android 技巧记录
  6. flex 事件注册和鼠标拖动
  7. Java面向对象(封装性概论)
  8. 【WebApi系列】浅谈HTTP
  9. Maven初步
  10. MySQL优化面试
  11. 1002-谈谈ELK日志分析平台的性能优化理念
  12. Spark分布式编程之全局变量专题【共享变量】
  13. No Directionality widget found
  14. tensorFlow(四)浅层神经网络
  15. jvm本地实战
  16. ssh生成私钥
  17. Microsoft Tech Summit 2017
  18. Java入门知识1
  19. python3.4学习笔记(二十五) Python 调用mysql redis实例代码
  20. Android之ToolBar和自定义ToolBar实现沉浸式状态栏

热门文章

  1. SourceTree 关于 .gitignore使用/下载
  2. [转]jQuery Mobile: Get data passed to page via changePage mobile.changePage
  3. Murano Application
  4. vue中遇到的坑
  5. 细讲递归(recursion)
  6. WEB服务器、网站、域名、IP地址、DNS服务器之间的关系
  7. Powershell(3)
  8. c#-day02学习笔记
  9. Devexpress GridControl使用
  10. c++ 控制台输入参数