理解 backbone.js 中的 bind 和 bindAll 方法,关于如何在方法中指定其中的 this,包含apply方法的说明[转载]
转载自:http://gxxsite.com/content/view/id/132.html
在backbone.js的学习过程中,被bind和bindAll弄得有点晕,这里包括underscore.js的bind和bindAll,以及JQuery提供的bind方法。
在一篇En博客中学习,写下这篇笔记
1、首先说熟悉的JQuery的bind,引用api帮助文件的内容即可很清晰地理解其使用意义和方法:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
 | 
dom.bind(type,[data],function(eventObject));dom.bind(type,[data],false);dom.bind(events);//例子//当每个段落被点击的时候,弹出其文本:$("p").bind("click", function(){  alert( $(this).text() );});//同时绑定多个事件类型:$('#foo').bind('mouseenter mouseleave', function() {  $(this).toggleClass('entered');});//同时绑定多个事件类型/处理程序:$("button").bind({  click:function(){$("p").slideToggle();},  mouseover:function(){$("body").css("background-color","red");},    mouseout:function(){$("body").css("background-color","#FFFFFF");}  });//你可以在事件处理之前传递一些附加的数据:function handler(event) {  alert(event.data.foo);}$("p").bind("click", {foo: "bar"}, handler)//通过返回false来取消默认的行为并阻止事件起泡:$("form").bind("submit", function() { return false; })//通过使用 preventDefault() 方法只取消默认的行为:$("form").bind("submit", function(event){  event.preventDefault();});//通过使用 stopPropagation() 方法只阻止一个事件起泡:$("form").bind("submit", function(event){  event.stopPropagation();}); | 
2、underscore.js的apply方法
  apply主要作用是让我们可以控制方法中this指代的值,下面用代码表述:
| 
 1 
2 
3 
4 
5 
 | 
var func = function beautiful(){  alert(this + ' is beautiful');};func.apply('Internet');//输出Internet is beautiful | 
以上例子只帮我们理解apply的作用,实际上,apply的意义何在,请看下例:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
 | 
function Developer(skill) {  this.skill = skill;  this.says = function(){    alert(this.skill + ' rocks!');  }}var john = new Developer('Ruby');var func = john.says;func();//输出undefined rocks! | 
上例可看出,在给调用对象john中的says方法定义一个单独的方法func后,执行func,this将被认为是func所处的对象,而不是john。这时apply可以解决问题,代码如下:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
 | 
function Developer(skill) {  this.skill = skill;  this.says = function(){    alert(this.skill + ' rocks!');  }}var john = new Developer('Ruby');var func = john.says;func.apply(john);//输出Ruby rocks! | 
这样做太复杂,所以需要用bind和bindAll来简化和规范化,请往下看。
3、underscore.js的bind方法
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
 | 
function Developer(skill) {  this.skill = skill;  this.says = function(){    alert(this.skill + ' rocks!');  }}var john = new Developer('Ruby');var func = _.bind(john.says, john); //绑定的方法是john对象执行says方法,里面的this指代的是第二个参数johnfunc();//输出Ruby rocks! | 
注意:_.bind()返回的值才是绑定的方法,而不会影响里面绑定的方法本身,看下例:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
 | 
window.ProductView = Backbone.View.extrend({  initialize: function() {    _.bind(this.render, this);    this.model.bind('change', this.render);  }});//这样做的结果是change触发的是原this.render,方法中的this依然是不可性预计window.ProductView = Backbone.View.extrend({  initialize: function() {    var f_render=_.bind(this.render, this);    this.model.bind('change', f_render);  }});//这是正确做法,或者更直接简单:window.ProductView = Backbone.View.extrend({  initialize: function() {    this.model.bind('change', _.bind(this.render, this));  }});//最简单当然是用_.bindAll:window.ProductView = Backbone.View.extrend({  initialize: function() {    _.bindAll(this, this.render);    this.model.bind('change', this.render);  }}); | 
4、underscore.js的bindAll方法
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
 | 
function Developer(skill) {  this.skill = skill;  this.says = function(){    alert(this.skill + ' rocks!');  }}var john = new Developer('Ruby');_.bindAll(john, 'says'); //绑定的方法是john中的says方法,里面的this指代john                         //可以一次过指定this到多个方法:_.bindAll(john,'says','work','gohome');var func = john.says;func();//输出Ruby rocks! | 
参考:http://blog.bigbinary.com/2011/08/18/understanding-bind-and-bindall-in-backbone.html
理解 backbone.js 中的 bind 和 bindAll 方法,关于如何在方法中指定其中的 this,包含apply方法的说明[转载]的更多相关文章
- Backbone.js的技巧和模式
		
Backbone.js的技巧和模式 Backbone.js的技巧和模式 本文由白牙根据Phillip Whisenhunt的<Backbone.js Tips And Patterns> ...
 - Js apply方法与call方法详解 附ES6新写法
		
我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这里我做如下笔记,希望和大家 ...
 - Js apply 方法 具体解释
		
Js apply方法具体解释 我在一開始看到javascript的函数apply和call时,很的模糊,看也看不懂,近期在网上看到一些文章对apply方法和call的一些演示样例,总算是看的有点眉目了 ...
 - Backbone中bind和bindAll的作用
		
本文参考: http://blog.bigbinary.com/2011/08/18/understanding-bind-and-bindall-in-backbone.html bindAll内部 ...
 - 全面解析JavaScript的Backbone.js框架中的Router路由
		
这篇文章主要介绍了Backbone.js框架中的Router路由功能,Router在Backbone中相当于一个MVC框架中的Controller控制器功能,需要的朋友可以参考下. Backbone ...
 - js中的bind方法的实现方法
		
js中目前我遇见的改变作用域的5中方法:call, apply, eval, with, bind. var obj = { color: 'green' } function demo () { c ...
 - js中的bind、apply、call、callee、caller的区别
		
1.bind.apply与call的区别与使用 相同点:2者是函数原型的一个方法,因此调用者都必须是函数,第1个参数都是对象.作用是,用另一个对象替换当前对象,另一对象也即是你传的第一个参数.通常用于 ...
 - js中bind,call,apply方法的应用
		
最近用js的类写东西,发现一个无比蛋疼的事,那就是封装的类方法中的this指针经常会改变指向,失去上下文,导致程序错误或崩溃. 比如: function Obj(){ this.type = &quo ...
 - Backbone.js中的where和findWhere
		
小编的公司框架用的MVC框架依旧是Backbone.js,老大说框架不重要,重要的是框架的编程思想.于是乎,小编从头开始学习Backbone.走马观花似的看了下API文档,撸起袖子就是干.但是碰到一个 ...
 
随机推荐
- 手把手教你清除WIN7的C盘垃圾
			
WIN7系统用着用着C盘会变得越来越大,可用空间变得越来越小,磁盘清理,和安全卫士怎么清也清不出这些系统深度的垃圾.我们可以手动删除,释放C盘空间. 这样一清理下来,结果我的C盘就释放了近10个GB的 ...
 - CoFun 1613 单词连接
			
Description Stan有N个不同的单词,这天,Stan新结交的两个朋友来他这里玩,Stan作为主人,他需要送给他们单词,但由于Stan不能偏心,所以Stan给每个单词一个权值v_i,他需要他 ...
 - 【Xamarin破解补丁找不到?】
			
前面的博文,推荐竟然那么点数目?下面的这个网址是个各种破解资源的站点,里面说不定有你想要的. http://onhax.net/ 要学会在搜索框搜索... 好吧,其实里面就有Xamarin的破解补丁 ...
 - seajs教程之seajs学习笔记  seajs.use用法
			
seajs.use 用来在页面中加载模块.通过 use 方法,可以在页面中加载任意模块. 实例地址:http://www.android100.org/html/201405/23/12807.htm ...
 - mysql 中 LIMIT的简单用法
			
mysql--语法: SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset --举例: select * from table l ...
 - zedboard--Opencv移植和zedboard测试(十一)
			
继上次生成了ARM架构的链接库之后,我们要把他们拷贝到装载有文件系统的SD卡中即可,在拷贝时,最好是/usr/lib下 实践一:将那些lib拷贝到U盘里面,因为之前跑过demo,里面就是一个简易的li ...
 - (转)25个增强iOS应用程序性能的提示和技巧--中级篇
			
在性能优化时,当你碰到一些复杂的问题,应该注意和使用如下技巧: 9.重用和延迟加载View10.缓存.缓存.缓存11.考虑绘制12.处理内存警告13.重用花销很大的对象14.使用Sprite Shee ...
 - 跟我学系列教程——《13天让你学会Redis》火热报名中
			
学习目标 每天2小时,13天让你学会Redis. 本课程针对Redis新手,甚至连Redis是什么都没有听说过的同学.课程会具体介绍Redis是什么以及为什么要使用Redis,结合项目实践旨在让学生从 ...
 - robots.txt网站爬虫文件设置
			
目录: 什么是robots.txt robots.txt使用误区 robots.txt使用技巧 什么是robots.txt? robots.txt是搜索引擎中访问网站的时候要查看的第一个文件.Robo ...
 - BOOST 线程完全攻略 - 扩展 - 可被关闭的线程类
			
本文假设读者已经基本了解boost线程库的使用方法. boost是个开源工程,线程这一块也在不断完善之中,到现在这个阶段,boost::thread仅仅实现了一个完美的技术框架,但是读者在实际使用中会 ...