js bind 函数 使用闭包保存执行上下文


Posted in Javascript onDecember 26, 2011
window.name = "the window object" 
function scopeTest() { 
return this.name; 
} 
// calling the function in global scope: 
scopeTest() 
// -> "the window object" 
var foo = { 
name: "the foo object!", 
otherScopeTest: function() { return this.name } 
}; 
foo.otherScopeTest();// -> "the foo object!" 
var foo_otherScopeTest = foo.otherScopeTest; 
foo_otherScopeTest(); 
// ?> "the window object"

如果你希望将一个对象的函数赋值给另外一个变量后,这个函数的执行上下文仍然为这个对象,那么就需要用到bind方法。
bind的实现如下:
// The .bind method from Prototype.js 
Function.prototype.bind = function(){ 
var fn = this, args = Array.prototype.slice.call(arguments), object = args.shift(); 
return function(){ 
return fn.apply(object, 
args.concat(Array.prototype.slice.call(arguments))); 
}; 
};

使用示例:
var obj = { 
name: 'A nice demo', 
fx: function() { 
alert(this.name); 
} 
}; 
window.name = 'I am such a beautiful window!'; 
function runFx(f) { 
f(); 
} 
var fx2 = obj.fx.bind(obj); 
runFx(obj.fx); 
runFx(fx2);

参考:
http://www.prototypejs.org/api/function/bind
PS:
才发现prototypejs的API文档解释的这么详细,一定要花点时间多看看了。
我的简单的实现:
Function.prototype.bind = function(obj) { 
var _this = this; 
return function() { 
return _this.apply(obj, 
Array.prototype.slice.call(arguments)); 
} 
} 
var name = 'window', 
foo = { 
name:'foo object', 
show:function() { 
return this.name; 
} 
}; 
console.assert(foo.show()=='foo object', 
'expected foo object,actual is '+foo.show()); 
var foo_show = foo.show; 
console.assert(foo_show()=='window', 
'expected is window,actual is '+foo_show()); 
var foo_show_bind = foo.show.bind(foo); 
console.assert(foo_show_bind()=='foo object', 
'expected is foo object,actual is '+foo_show_bind());
Javascript 相关文章推荐
javascript attachEvent绑定多个事件执行顺序问题
Oct 20 Javascript
百度移动版的url编码解码示例
Apr 29 Javascript
JavaScript中instanceof运算符的使用示例
Jun 08 Javascript
javascript弹出窗口中增加确定取消按钮
Jun 24 Javascript
canvas绘制的直线动画
Jan 23 Javascript
es6 字符串String的扩展(实例讲解)
Aug 03 Javascript
JavaScript正则表达式的贪婪匹配和非贪婪匹配
Sep 05 Javascript
解决使用vue.js路由后失效的问题
Mar 17 Javascript
Vue动画事件详解及过渡动画实例
Feb 09 Javascript
JS中自定义事件的使用与触发操作实例分析
Nov 01 Javascript
微信小程序国际化探索实现(附源码地址)
May 20 Javascript
elementui更改el-dialog关闭按钮的图标d的示例代码
Aug 04 Javascript
js 函数调用模式小结
Dec 26 #Javascript
JavaScript 原型继承
Dec 26 #Javascript
jquery事件机制扩展插件 jquery鼠标右键事件。
Dec 26 #Javascript
查看源码的工具 学习jQuery源码不错的工具
Dec 26 #Javascript
初学Jquery插件制作 在SageCRM的查询屏幕隐藏部分行的功能
Dec 26 #Javascript
非常有用的40款jQuery 插件推荐(系列二)
Dec 25 #Javascript
JS代码优化技巧之通俗版(减少js体积)
Dec 23 #Javascript
You might like
用PHP控制用户的浏览器--ob*函数的使用说明
2007/03/16 PHP
解析关于java,php以及html的所有文件编码与乱码的处理方法汇总
2013/06/24 PHP
php实现的返回数据格式化类实例
2014/09/22 PHP
ThinkPHP和UCenter接口冲突的解决方法
2016/07/25 PHP
PHP判断用户是否已经登录(跳转到不同页面或者执行不同动作)
2016/09/22 PHP
Laravel 使用查询构造器配合原生sql语句查询的例子
2019/10/12 PHP
ASP.NET jQuery 实例12 通过使用jQuery validation插件简单实现用户注册页面验证功能
2012/02/03 Javascript
js拦截alert对话框另类应用
2013/01/16 Javascript
为JS扩展Array.prototype.indexOf引发的问题探讨及解决
2013/04/24 Javascript
js的.innerHTML = ""IE9下显示有错误的解决方法
2013/09/16 Javascript
js日期、星座的级联显示代码
2014/01/23 Javascript
IE6-8中Date不支持toISOString的修复方法
2014/05/04 Javascript
简要了解jQuery移动web开发的响应式布局设计
2015/12/04 Javascript
Nodejs如何搭建Web服务器
2016/03/28 NodeJs
基于jQuery的ajax方法封装
2016/07/14 Javascript
jQuery快速高效制作网页交互特效
2017/02/24 Javascript
解决jquery appaend元素中id绑定事件失效的问题
2017/09/12 jQuery
微信小程序slider组件使用详解
2018/01/31 Javascript
微信小程序单选radio及多选checkbox按钮用法示例
2019/04/30 Javascript
使用 node.js 模仿 Apache 小部分功能
2019/07/07 Javascript
Python抓取京东图书评论数据
2014/08/31 Python
Python中的 ansible 动态Inventory 脚本
2020/01/19 Python
python生成xml时规定dtd实例方法
2020/09/21 Python
完美解决Pycharm中matplotlib画图中文乱码问题
2021/01/11 Python
python实现计算图形面积
2021/02/22 Python
html5之Canvas路径绘图、坐标变换应用实例
2012/12/26 HTML / CSS
HTML5 Canvas 实现圆形进度条并显示数字百分比效果示例
2017/08/18 HTML / CSS
股东合作协议书
2014/04/14 职场文书
庆六一文艺汇演活动方案
2014/08/26 职场文书
党的群众路线教育实践活动领导班子整改措施
2014/09/30 职场文书
旷工检讨书1000字
2015/01/01 职场文书
公司2015年终工作总结
2015/05/26 职场文书
再次探讨go实现无限 buffer 的 channel方法
2021/06/13 Golang
Python实现简单的猜单词
2021/06/15 Python
Spring Bean是如何初始化的详解
2022/03/22 Java/Android
MySQL8.0 Undo Tablespace管理详解
2022/06/16 MySQL