call 方法和 apply 方法的作用及意义是什么?什么时候使用?
原文出处:汇智网
call()
和apply()
都是JavaScript 中函数对象上的方法:
var f = function () {};
'call' in f; // true
'apply' in f; // true
说到函数,JavaScript 中有个this
的概念与函数调用相关,this
指向一个对象,表示函数调用时的执行上下文;当在函数内引用this
的时候,就会指向这个对象。
var man = {
name: 'Jason',
sayName: function() {
console.log(this.name);
}
}
man.sayName(); // 输出'Jason'
上面的例子中,sayName()
是对象man
上的方法,sayName()
里this
指向sayName()
所在的对象(即man
),this.name
实际上是man.name
,因此最后输出'Jason'。
如果函数不是对象上的方法,那this
默认情况下会指向全局上下文,在浏览器中,也就是window
:
window.name = 'Tommy'
function foo() {
console.log(this.name);
}
foo(); // `this`指向`window`,所以输出'Tommy'
明白了this
之后,call()
和apply()
就好解释了。这两个方法的作用是在函数调用时改变函数的执行上下文,也就是函数内的this
;这两个方法第一个参数,就是希望得到的this
。
比如上面的foo
函数,由于定义在全局环境中,this
默认指向window
;如果想更改里面指向的this
,例如改成man
,可以调用foo
的call()
方法,然后把man
传进来:
foo.call(man); // 输出`man`
foo.apply(man); // 也是输出`man`
两个方法都可以更改函数执行时绑定的this
;那它们有什么不同呢?主要是在传参上。
假如foo
定义时包括了形参:
window.name = 'Tommy'
function foo(a, b) {
console.log(a + b + this.name);
}
也就是说foo
调用时期望传进两个参数,所以对于foo.call()
和foo.apply()
的形式,第一个参数指定绑定的this
,后面的参数指定foo
调用时期望传入的参数(有2个);对于call
来说,两个参数一个一个传进来;而对于apply
来说,两个参数必须组成一个数组,以数组方式传进来:
foo.call(man, 'Hello, ', 'Mr.'); // 输出‘Hello, Mr.Jason’
foo.apply(man, ['Hello, ', 'Mr.']); // 同样输出‘Hello, Mr.Jason’
比较下直接调用foo
的结果
foo('Hello, ', 'Mr.'); 输出‘Hello, Mr.Tommy’
感谢您的阅读,如果您对我的文章感兴趣,可以关注我的博客,我是叙帝利,下篇文章再见!
低代码平台必备轻量级 GUI 库 https://github.com/acrodata/gui
适用于 Angular 的 CodeMirror 6 组件 https://github.com/acrodata/code-editor
适用于 Angular 的水印组件(防删除,盲水印) https://github.com/acrodata/watermark
开发低代码平台的必备拖拽库 https://github.com/ng-dnd/ng-dnd
基于 Angular Material 的中后台管理框架 https://github.com/ng-matero/ng-matero
Angular Material Extensions 扩展组件库 https://github.com/ng-matero/extensions
Unslider 轮播图插件纯 JS 实现 https://github.com/nzbin/unsliderjs
仿 Windows 照片查看器插件 https://github.com/nzbin/photoviewer
仿 Windows 照片查看器插件 jQuery 版 https://github.com/nzbin/magnify
完美替代 jQuery 的模块化 DOM 库 https://github.com/nzbin/domq
简化类名的轻量级 CSS 框架 https://github.com/nzbin/snack
与任意 UI 框架搭配使用的通用辅助类 https://github.com/nzbin/snack-helper
单元素纯 CSS 加载动画 https://github.com/nzbin/three-dots
有趣的 jQuery 卡片抽奖插件 https://github.com/nzbin/CardShow
悬疑科幻电影推荐 https://github.com/nzbin/movie-gallery
锻炼记忆力的小程序 https://github.com/nzbin/memory-stake