先从一个例子说起

var sound = 'Roar';
function myOrneryBeast()
{
this.style.color='green';//window 方法被调用时所属的对象
alert(sound);
}
// this 的环境可以随着函数被赋值给不同的对象而改变
function initPage()
{
var example=ADS.$('example');
//使用事件属性方法
example.onlick=myOrneryBeast;
//或者使用ADS.addEvent方法
ADS.addEvent(example,'mouseover',myOrneryBeast);
}
ADS.addEvent(window,'load',initPage);

通过call()和apply()重新定义执行环境,同样我们通过一个例子看一下

function doubleCheck()
{
this.message='Are you sure you want to leave?';
} doubleCheck.prototype.sayGoodbye=function()
{
return confirm(this.message)
}
initPage()
{
var clickedLink=new doubleCheck();
var links=document.getElementsByTagName('a');
for (var i = 0;i<links.length ;i++ )
{
ADS.addEvent(links[i],'click',clickedLink.sayGoodbye);
}
}
//这部分我一开始也没看懂,不前面的this 又看了一边,才稍微有点想明白。
//当sayGoodbye方法在<a>这个HTML中执行时,this所引用的就是这个HTML元素,而不是期望的clickedLink对象
ADS.addEvent(window,'load',initPage)

解决办法:用function对象的call() 或者apply()
让方法thisy引用window对象的情况下可以clickedLink.sayGoodbye.call(window);或者clickedLink.sayGoodbye.apply(window);

对于call而言,每个参数都应该位于对象之后比如:

functionReference.call(object,argument1,argument2,....);

对于apply(),则应该将方法参数作为一个数组放在第二个参数位置上传递:

functionReference.apply(object,arguments)//这是call和apply的唯一区别

//下面函数主要是为了给原始函数(有func参数传递)创建一个新的环境。之后虽然原始函数仍然接受同样的参数,但是他却有了不同的环境
//(菜鸟通过实力图,理解稍微好一点。仅仅是稍微)
function bindFunction(obj,func)
{
return function ()
{
func.apply(obj,arguments);
}
}

将此例用在刚刚的doubleCheck()方法中

function doubleCheck()
{
this.message='Are you sure you want to leave?'; }
douleCheck.prototy.sayGoodbye=function()
{
return confirm(this.message);
}
initPage()
{
var clickLink=new doubleCheck();
var links=document.getElementsByTagName('a'); for (var i = 0;i<links.length ;i++ )
{
//已经将刚刚的方法加入ADS库中
ADS.addEvent(links[i],'click',ADS.bindFunction(clickedLink,clickedLink.sayGoodby));
}
}

本节就记录到这儿了,菜鸟接下来还要继续学习js的关于try{}catch{}的相关只是。

最新文章

  1. redis 缓存技术与memcache的区别
  2. Delphi与Windows 7下的用户账户控制(UAC)机制 及 禁用兼容性助手
  3. UWP深入学习三:依赖属性、附加属性和数据绑定
  4. node-webkit教程(8)Platform Service之Clipboard
  5. AutoIT 实现Firefox上传文件
  6. hadoop面试题答案
  7. Gwt 整合FusionCharts及封装搜狗地图时出现的问题
  8. QT小插件类之QRoundProgressBar
  9. Unity扩展让枚举视图中变成多选框
  10. 用友CDM系统,将货位间商品移库单(一步)修改为内调出入库单(一步)方法使用
  11. Mac 下载安装MySQL
  12. 【转】java jvm 线程 与操作系统线程
  13. Python3.7 Scrapy crawl 运行出错解决方法
  14. mysql建表基本语法
  15. 文本分类学习 (八)SVM 入门之线性分类器
  16. BZOJ4923:[Lydsy1706月赛]K小值查询(Splay)
  17. 接口与virtual,override,new关键字
  18. C# 中的#if、#elif、#else、#endif等条件编译符号 (转载)
  19. AJAX原生JavaScript写法
  20. Nginx 限制php解析、限制浏览器访问

热门文章

  1. javascript之数据推送
  2. spring heibernate 调用存储过程
  3. solaris bind 符号未定义
  4. 使用Hibernate 拦截执行sql语句,并输出sql语句,获取sql语句
  5. ZENCART 打开/关闭日志文件
  6. 用PHP生成随机数的函数
  7. (转)《深入理解java虚拟机》学习笔记8——Tomcat类加载器体系结构
  8. EXTJS 4.2 资料 控件之Grid 列鼠标悬停提示
  9. 从JAVA多线程理解到集群分布式和网络设计的浅析
  10. html 设置Select options值进行绑定