call()和apply()
2024-08-29 06:04:21
每个函数都包含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。
最新文章
- SQL Server索引视图以(物化视图)及索引视图与查询重写
- SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问
- 【转载】Web应用工作原理
- RadHat搭建内网YUM源server
- Android 技巧记录
- flex 事件注册和鼠标拖动
- Java面向对象(封装性概论)
- 【WebApi系列】浅谈HTTP
- Maven初步
- MySQL优化面试
- 1002-谈谈ELK日志分析平台的性能优化理念
- Spark分布式编程之全局变量专题【共享变量】
- No Directionality widget found
- tensorFlow(四)浅层神经网络
- jvm本地实战
- ssh生成私钥
- Microsoft Tech Summit 2017
- Java入门知识1
- python3.4学习笔记(二十五) Python 调用mysql redis实例代码
- Android之ToolBar和自定义ToolBar实现沉浸式状态栏
热门文章
- SourceTree 关于 .gitignore使用/下载
- [转]jQuery Mobile: Get data passed to page via changePage mobile.changePage
- Murano Application
- vue中遇到的坑
- 细讲递归(recursion)
- WEB服务器、网站、域名、IP地址、DNS服务器之间的关系
- Powershell(3)
- c#-day02学习笔记
- Devexpress GridControl使用
- c++ 控制台输入参数