S1:动态方法调用:call & apply
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(){
//显示true
alert(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();
//显示 2
console.dir(arguments.length);
}
fun4('myName');
S1:动态方法调用:call & apply的更多相关文章
- Struts2学习笔记 - Action篇<动态方法调用>
有三种方法可以使一个Action处理多个请求 动态方法调用DMI 定义逻辑Acton 在配置文件中使用通配符 这里就说一下Dynamic Method nvocation ,动态方法调用,什么是动态方 ...
- 第三章Struts2 Action中动态方法调用、通配符的使用
01.Struts 2基本结构 使用Struts2框架实现用登录的功能,使用struts2标签和ognl表达式简化了试图的开发,并且利用struts2提供的特性对输入的数据进行验证,以及访问Servl ...
- Struts2 动态方法调用
01.Struts 2基本结构 使用Struts2框架实现用登录的功能,使用struts2标签和ognl表达式简化了试图的开发,并且利用struts2提供的特性对输入的数据进行验证,以及访问Servl ...
- struts之动态方法调用使用通配符
一.DMI动态方法调用的其中一种改变form表单中action属性的方式已经讲过了.还有两种,一种是改变struts.xml配置文件中action标签中的method属性,来指定执行不同的方法处理不同 ...
- struts之动态方法调用改变表单action属性
一.动态方法调用(DMI:Dynamic Method Invocation) ⒈struts2中同样提供了这个包含多个逻辑业处理的Action,这样就可以在一个Action中进行多个业务逻辑处理 ...
- struts2DMI(动态方法调用)
struts2动态方法调用共有三种方式: 1.通过action元素的method属性指定访问该action时运行的方法 <package name="action" exte ...
- Struts2 Action中动态方法调用、通配符的使用
一.Struts2执行过程图: 二.struts2配置文件的加载顺序 struts-default.xml---struts-plugin.xml---struts.xml 具体步骤: 三.Actio ...
- Struts(八):动态方法调用
动态方法调用:通过url动态调用action中的方法. 默认情况下,Struts的动态方法调用处于禁用状态. 测试定义一个action类: package com.dx.actions; public ...
- Struts 2之动态方法调用,不会的赶紧来
学习Struts2框架以来为了减少Action 的数量,我们可以使用动态方法进行处理. 动态方法调用(Dynamic Method Invocation,DMI)是指表单元素的Action并不是直接等 ...
随机推荐
- Springmvc中 同步/异步请求参数的传递以及数据的返回
转载:http://blog.csdn.net/qh_java/article/details/44802287 注意: 这里的返回就是返回到jsp页面 **** controller接收前台数据的方 ...
- [转发] 理解 oauth 2.0
原文: http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html oauth 的各种编程语言实现: http://oauth.net/2/ 理解OAu ...
- linux学习笔记2-命令总结4
帮助命令 help - 帮助命令 man - 获取帮助信息 用户管理命令 useradd - 添加新用户 passwd - 设置用户密码 who - 显示所有用户 w - 查看更详细的用户信息 use ...
- bootstrap学习笔记<九>(菜单,按钮。导航基本元素)
有了bootstrap作导航不再麻烦,几个样式,几个标签就能轻松搞定. 下面就来分解学习导航条的制作. 一.首先是下拉菜单 <div class="dropdown"> ...
- Python学习(19)正则表达式
目录 Python 正则表达式 re.match 函数 re.search 方法 re.match 函数与 re.search 方法区别 检索和替换 正则表达式修饰符 - 可选标志 正则表达式模式 正 ...
- postgresql如何实现group_concat功能
MySQL有个聚集函数group_concat, 它可以按group的id,将字段串联起来,如 表:id name---------------1 A2 B1 B SELECT id, group_c ...
- ssh免密码登陆及其原理
ssh 无密码登录要使用公钥与私钥.linux下可以用用ssh-keygen生成公钥/私钥对,下面我以CentOS为例. 有机器A(192.168.1.155),B(192.168.1.181).现想 ...
- Spring源码分析心得-Bean的读取和注册
Spring广泛的被使用足以证明它的价值,成功的东西自然值得我们深入学习.有很多人说的熟悉Spring也只是简单的使用经验,当我发现我也是其中一员时我很恐惧,所以开始扒源码,准备深入了解,话不多说,直 ...
- HashMap详解
HashMap:http://www.cnblogs.com/xwdreamer/archive/2012/06/03/2532832.html ConcurrentHashMap:http://ww ...
- 自定义MVC Html
自定义ASP.NET MVC Html辅助方法 在ASP.NET MVC中,Html辅助方法给我们程序员带来很多方便,其重要性也就不言自明.有时候,我们不想重复地写一些HTML代码,或者MS没有提供我 ...