本文实例分析了 JavaScript 中 call 和 apply 方法的区别. 分享给大家供大家参考, 具体如下:
这两个方法不经常用, 但是在某些特殊场合中是非常有用的, 下面主要说下它们的区别:
1, 首先, JavaScript 是一门面向对象的语言, 也就是说它有 this 的概念. 而且 JavaScript 是一门动态类型语言, 为什么说它是动态类型语言呢? 因为 JavaScript 在编译时没有类型检查的过程, 不会去检查创建的对象类型, 也不会去检查传递的参数类型, 所以它的变量类型在运行期间是可以改变的.
2, 要知道 call 和 apply 都是为了改变某个函数运行时的上下文 (context) 而存在的, 也就是为了改变函数, 也可以说是对象 (函数本身就是对象) 内部 this 的指向而存在的.
3, 二者区别为: 传参数的方式不一样, 如下:
- func.call(this, arg1, arg2);
- func.apply(this, [arg1, arg2]);
上面也很清楚了, call 传参数时, 明确知道时几个参数或者参数较少时, 比如 arg1,arg2, 挨个传就是了;
而 apply 第二个参数必须为一个数组, 即将参数放进数组中即可.
4, 实例
- (function(){
- Array.prototype.push.call(arguments, 4);//arguments 借用 Array.prototype.push 方法
- console.log( arguments ); // 输出: [1, 2, 3, 4]
- })(1, 2, 3);
- var currying = function(fn){
- var args = [];
- return function(){
- if( arguments.length === 0){
- return fn.apply( this, args);
- }
- else{
- [].push.apply( args, arguments);
- return arguments.callee; //callee 已弃用
- }
- }
- };
- var cost = (function(){
- var money = 0;
- return function(0{
- for(var i = 0,l - arguments.length;i<l;i++){
- money += arguments[i];
- }
- return money;
- }
- })();
调用:
- var cost_ = currying(cost); // 将 cost 转化成 curring 函数
- cost_(1); cost_(2); alert(cost_()); // 输出: 3
解释: 通过 currying(柯里化)的转化, 在 cost_中传入参数时, 未能得到值, 而是将值存储起来, 直到当无参数传入时, 输出结果.
更多关于 JavaScript 相关内容可查看本站专题:JavaScript 常用函数技巧汇总,javascript 面向对象入门教程,JavaScript 错误与调试技巧总结,JavaScript 数据结构与算法技巧总结及JavaScript 数学运算用法总结
来源: http://www.jb51.net/article/145013.htm