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 相关文章推荐
jQuery 剧场版 你必须知道的javascript
May 27 Javascript
jQuery插件开发基础简单介绍
Jan 07 Javascript
ExtJS4给Combobox设置列表中的默认值示例
May 02 Javascript
js下将阿拉伯数字每三位一逗号分隔(如:15000000转化为15,000,000)
Jun 02 Javascript
浅谈js的setInterval事件
Dec 05 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(下)
Oct 28 Javascript
老生常谈 js中this的指向
Jun 30 Javascript
谈谈JavaScript的New关键字
Aug 26 Javascript
jQuery使用eraser.js插件实现擦除、刮刮卡效果的方法【附eraser.js下载】
Apr 28 jQuery
微信小程序事件对象中e.target和e.currentTarget的区别详解
May 08 Javascript
js实现验证码功能
Jul 24 Javascript
为什么node.js不适合大型项目
Apr 28 Javascript
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网站备份程序代码分享
2011/06/10 PHP
PHP数组排序函数合集 以及它们之间的联系分析
2013/06/27 PHP
php中url传递中文字符,特殊危险字符的解决方法
2013/08/17 PHP
php下载文件源代码(强制任意文件格式下载)
2014/05/09 PHP
PHP 面向对象程序设计(oop)学习笔记 (五) - PHP 命名空间
2014/06/12 PHP
php实现XSS安全过滤的方法
2015/07/29 PHP
PHP实现的自定义图像居中裁剪函数示例【测试可用】
2017/08/11 PHP
YII框架关联查询操作示例
2019/04/29 PHP
在Javascript中定义对象类别
2006/12/22 Javascript
直接生成打开窗口代码,不必下载
2008/05/14 Javascript
JS 文件大小判断的实现代码
2010/04/07 Javascript
JavaScript设计模式之单例模式实例
2014/09/24 Javascript
一个jquery实现的不错的多行文字图片滚动效果
2014/09/28 Javascript
对JavaScript的全文搜索实现相关度评分的功能的方法
2015/06/24 Javascript
jquery实现通用的内容渐显Tab选项卡效果
2015/09/07 Javascript
Node.js开发教程之基于OnceIO框架实现文件上传和验证功能
2016/11/30 Javascript
深究AngularJS如何获取input的焦点(自定义指令)
2017/06/12 Javascript
基于nodejs+express4.X实现文件下载的实例代码
2017/07/13 NodeJs
详解Webpack多环境代码打包的方法
2018/08/03 Javascript
微信小程序实现签到功能
2018/10/31 Javascript
layui动态表头的实现代码
2019/08/22 Javascript
在Python3中初学者应会的一些基本的提升效率的小技巧
2015/03/31 Python
Python实现基本线性数据结构
2016/08/22 Python
使用python编写监听端
2018/04/12 Python
Pandas中把dataframe转成array的方法
2018/04/13 Python
Python音频操作工具PyAudio上手教程详解
2019/06/26 Python
Anaconda+Pycharm环境下的PyTorch配置方法
2020/03/13 Python
英文求职信结束语大全
2013/10/26 职场文书
村委会贫困证明范文
2014/09/21 职场文书
委托培训协议书
2014/11/17 职场文书
2016年小学植树节活动总结
2016/03/16 职场文书
驾驶员安全责任协议书
2016/03/22 职场文书
写作技巧:如何撰写商业计划书
2019/08/08 职场文书
Go各时间字符串使用解析
2021/04/02 Golang
20180830晚上第一届KSL半决赛 雨神vs解冻(二龙 三炮解说)
2022/04/01 星际争霸
公历12个月名称的由来
2022/04/12 杂记