javascript中call apply 的应用场景


Posted in Javascript onApril 16, 2015

在一些jQuery插件中经常看到类似 callback.call(xxx,xxx) 虽然看到书上有介绍 说call和apply函数可以改变作用域,但还是无法非常透彻的理解改变作用域主要是为了解决什么问题,有没有替代方案,或者 这2个函数主要为了解决什么问题,应用场景,何时使用最合适,每次读到这样的代码就晕了,一下子从线性阅读中跳出去了,感觉有点绕

call和apply的作用很简单,就是改变上下文,适用场景太多了,虽然有时候只是为了“美观”,下面几个是我常用的。

1.

Object.prototype.toString.call(Obj)

用来判断 Obj 的类型

arguments 虽然和Array 很像,但是他没有Array的push之类的方法,怎么办?
Array.prototype.push.call(arguments)

3.Javascript 没有私有方法的概念,想用闭包实现

(function () {
  var Person = function () {
    this.doSomeThing = function () {
      _privateFunction.call(this);
    }
  }

  var _privateFunction = function () {

  }

  window.Person = Person;

}).call(window);

差不多就是这个意思,callback的时候,当你希望你的callback中的上下文是当前上下文的时候,也可以用call或者apply,有什么好处呢?

这个时候你的callback 里面的this 就是指代当前上下文。例如一个类Person,然后他的方法 say 有一个callback的参数,如果这个callback是通过普通的括号来执行的话,那在这个callback里面执行person的其它方法还需要用person.other 来实现,但是切换上下文之后,就是this.other搞定~代码对比如下:

var Person = function(){

};

Person.prototype.say = function(callback){
  callback();
};

Person.prototype.other = function(){

};

var vincent = new Person();

vincent.say(function(){
  vincent.other();
});

用了call的:

var Person = function(){

};

Person.prototype.say = function(callback){
  callback.call(this);
};

Person.prototype.other = function(){

};

var vincent = new Person();

vincent.say(function(){
  this.other();
});

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
xmlHTTP实例
Oct 24 Javascript
javascript下给元素添加事件的方法与代码
Aug 13 Javascript
IE6-8中Date不支持toISOString的修复方法
May 04 Javascript
Node.js中的模块机制学习笔记
Nov 04 Javascript
深入解析JavaScript编程中的this关键字使用
Nov 09 Javascript
JavaScript利用正则表达式替换字符串中的内容
Dec 12 Javascript
jQuery实现弹窗下底部页面禁止滑动效果
Dec 19 jQuery
解决使用Vue.js显示数据的时,页面闪现原始代码的问题
Feb 11 Javascript
JavaScript门道之标准库
May 26 Javascript
微信小程序利用canvas 绘制幸运大转盘功能
Jul 06 Javascript
微信小程序动态添加和删除组件的现实
Feb 28 Javascript
vue+elementui通用弹窗的实现(新增+编辑)
Jan 07 Vue.js
javascript三元运算符用法实例
Apr 16 #Javascript
jQuery on()方法使用技巧详解
Apr 16 #Javascript
JavaScript简单表格编辑功能实现方法
Apr 16 #Javascript
JavaScript转换二进制编码为ASCII码的方法
Apr 16 #Javascript
JavaScript实现彩虹文字效果的方法
Apr 16 #Javascript
JavaScript监听文本框回车事件并过滤文本框空格的方法
Apr 16 #Javascript
JQuery跳出each循环的方法
Apr 16 #Javascript
You might like
php array_merge下进行数组合并的代码
2008/07/22 PHP
PHP中数组合并的两种方法及区别介绍
2012/09/14 PHP
php使用ob_flush不能每隔一秒输出原理分析
2015/06/02 PHP
Thinkphp5.0框架视图view的循环标签用法示例
2019/10/12 PHP
在textarea中屏蔽js的某个function的javascript代码
2007/04/20 Javascript
jQuery 表单验证扩展(四)
2010/10/20 Javascript
js 获取时间间隔实现代码
2014/05/12 Javascript
详解JavaScript对象类型
2016/06/16 Javascript
node thread.sleep实现示例
2018/06/20 Javascript
vue中的过滤器实例代码详解
2019/06/06 Javascript
JS闭包原理及其使用场景解析
2020/12/03 Javascript
详解vue中使用transition和animation的实例代码
2020/12/12 Vue.js
python异步任务队列示例
2014/04/01 Python
Python实现远程调用MetaSploit的方法
2014/08/22 Python
编程语言Python的发展史
2014/09/26 Python
python同时给两个收件人发送邮件的方法
2015/04/30 Python
利用Python的Django框架生成PDF文件的教程
2015/07/22 Python
python统计字母、空格、数字等字符个数的实例
2018/06/29 Python
Python分割指定页数的pdf文件方法
2018/10/26 Python
python实现移位加密和解密
2019/03/22 Python
python实现自动化上线脚本的示例
2019/07/01 Python
python区块及区块链的开发详解
2019/07/03 Python
详细介绍pandas的DataFrame的append方法使用
2019/07/31 Python
Pyinstaller 打包exe教程及问题解决
2019/08/16 Python
阿里云ECS服务器部署django的方法
2019/08/29 Python
Python面向对象中类(class)的简单理解与用法分析
2020/02/21 Python
python mysql自增字段AUTO_INCREMENT值的修改方式
2020/05/18 Python
django-orm F对象的使用 按照两个字段的和,乘积排序实例
2020/05/18 Python
Giglio英国站:意大利奢侈品购物网
2018/03/06 全球购物
介绍一下XMLHttpRequest对象
2012/02/12 面试题
医疗专业毕业生求职信
2014/08/28 职场文书
2014年党风建设工作总结
2014/11/19 职场文书
股权转让协议书
2014/12/07 职场文书
2019经典广告词集锦!
2019/07/02 职场文书
导游词之青岛太清宫
2019/12/13 职场文书
《LOL》“克隆大作战”久违归来 幻灵战队皮肤上线
2022/04/03 其他游戏