js中函数执行的两种方式:一是通过调用运算符’()’,二是通过调用call或apply来动态执行。

一、动态方法调用中指定this对象

开发中我们往往需要在对象B中调用对象A的方法,这个时候就用到了apply()和call(),它们的第一个参数就是用于指定this对象,如果为null,则表明传入默认的宿主对象。

function foo(){alert(this.name);
}
function MyObject(){this.name = 'MyObject';
}
MyObject.prototype.do = function(){foo.apply(this);
}var obj = new MyObject();
//弹出'MyObject',这里的this就是obj
obj.do(); 

二、栈的可见与修改

function fun1(v1){var v1 = 100;
}
function fun2(name){fun1.apply(this,arguments);alert(name);
}
//传入参数未被修改,仍然弹出'myName'
fun2('myName');

这是因为,fun1.apply()被调用时,arguments被做了一次复制:值数据被复制,引用数据被创建引用。因此fun1与fun2中的arguments虽然看起来是相同的,其实是被隔离的两套数据。但是,如果把fun1改成下面这样:

function fun1(){//显示truealert(arguments.callee.caller === fun2);
}

所以外层的函数对于内部被调用的函数依然是可见的,尽管arguments在call() || apply()时是通过复制加以隔离的,但是调用栈对于被调用函数仍然可见,被调用函数仍然可以访问栈上的arguments,如:

function fun1(name){arguments.callee.caller.arguments[0] = 100;//alert(arguments.callee.caller === fun2)
}
function fun2(name){fun1.apply(this,arguments);alert(name);
}
//显示传入的参数被改为 100
fun2('myName');

在fun1中,我们通过callee与caller访问到栈上的函数的参数,并修改了fun2中的形式参数name,然而fun2并不知道形参已经被修改,因此这是极其危险的! 小盆友们都知道,类Arguments和Array通常是共享一个父类的——这是因为它们都有一个需要自维护的length属性。因此,我们也可以把Array原型中的方法apply到arguments实例上,例如:

[].slice.call(arguments,1);

但这也增加了调用栈上的风险:我们不但可以修改arguments中某些参数的值,也可修改arguments传入值的个数。例如:

function fun3(name){[].push.call(arguments.callee.caller.arguments,100);
}
function fun4(name){fun3();//显示 2console.dir(arguments.length);
}fun4('myName');

转载于:https://www.cnblogs.com/kuangliu/p/4386406.html

S1:动态方法调用:call apply相关推荐

  1. struts2学习 - action -3 动态方法调用 DMI

    Action执行的时候并不一定要执行execute方法 可以在配置文件中配置Action的时候用method=来指定执行哪个方法 也可以在url地址中动态指定(动态方法调用DMI)(推荐)   配置文 ...

  2. Struts2动态方法调用

    2019独角兽企业重金招聘Python工程师标准>>> 动态方法调用 在Struts2中动态方法调用有三种方式,动态方法调用就是为了解决一个Action对应多个请求的处理,以免Act ...

  3. Struts2学习第二天——动态方法调用

    result的type属性 指定result的类型,不同类型的result代表不同的结果输出 默认取值dispatcher,请求转发(forward)到本程序里指定的资源 可以在Struts-defa ...

  4. struts2静态方法和动态方法调用

    1 jsp页面 <%@ page language="java" import="java.util.*" pageEncoding="UTF- ...

  5. Struts2使用!动态方法调用无效

    在Struts2的action配置中,可以使用method属性来实现方法的动态调用,除此之外还有一种方式可以实现方法的动态调用,那就是在url中 的action后跟!再跟指定的方法名,比如localh ...

  6. 【学习笔记11】动态方法调用和使用通配符定义action

    2019独角兽企业重金招聘Python工程师标准>>> 动态方法调用: 如果Action中存在多个方法时,我们可以使用 !+方法名调用指定方法.如下: public class He ...

  7. struts2-通配符和动态方法调用

    通配符举例--BookAction 1 public class BookAction extends ActionSupport { 2 3 public String execute() thro ...

  8. Struts2学习---基本配置,action,动态方法调用,action接收参数

    首先我们先来直接配置,然后再来讲原理:  第一步:jar包的引入:  我们可以到struts2的官网上下载:  http://struts.apache.org/download.cgi#struts ...

  9. struts2的通配符和动态方法调用

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC     &quo ...

最新文章

  1. @ResponseBody 和 @RequestBody 的作用
  2. windows7 32升级64位 硬盘安装_LabVIEW 2018(32/64)位 软件安装教程
  3. Koa 中实现 chunked 数据传输
  4. python发送邮件并返回提示_python-邮件提醒功能
  5. magic_quotes_gpc与magic_quotes_runtime区别
  6. vue文件上传 vue-simple-upload的使用方法
  7. 一道头条面试题,小夕差点没读懂题目,找出数组中缺失的数字,最近击败100%的用户!...
  8. 电子信息工程专业打工人的蓝桥杯嵌入式竞赛时记
  9. linux消息队列 性能,消息队列消息总大小的问题
  10. Java Instrument实践应用:运行中修改程序的Class
  11. win10计算机打开速度慢,win10电脑系统开机启动速度慢如何解决?
  12. oracle设置session空闲时间超时断开
  13. Mac OSX 好用的解压软件
  14. 互联网江湖之“清华1996级”
  15. 小程序开发学习(3)---.wxss详解篇
  16. ( 题解 )第六届蓝桥杯决赛试题 -- 完美正方形 (线段树 + 深搜)
  17. zuk如将手机更新到Android10,ZUI新升级:ZUK宣布支持全机型升级Android N系统
  18. 6-7 判断满足条件的三位数 (15 分)
  19. java编译release版本断言_关于Debug和Release之本质区别
  20. C语言学生随机抽号演讲计分系统

热门文章

  1. 正则表达式系统教程.CHM
  2. LeetCoed 5383. 给 N x 3 网格图涂色的方案数
  3. PAT1070. 结绳
  4. ROS学习笔记11(用C++写一个简单的消息发布和消息订阅)
  5. 测试面试题集-网络基础
  6. 巴里克黄金CEO:加密货币并不是比黄金更好的价值储存方式
  7. SAP License:SAP订单的归档及删除
  8. 百行征信大揭秘,字段中间找关系
  9. Teradata在中国银行业的应用简介
  10. Centos6.6部署Redis集群