1. 程式人生 > >理解 backbone.js 中的 bind 和 bindAll 方法,關於如何在方法中指定其中的 this,包含apply方法的說明[轉載]

理解 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指代的是第二個引數john func(); //輸出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!

相關推薦

理解 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

JSsetInterval()clearInterval()的使用以及注意事項 (實用贊)

原文出處:https://blog.csdn.net/YDesire/article/details/81124331 延伸閱讀:clearInterval(timer)和timer = null的區別 setInterval(): 間隔指定的毫秒數不停地執行指定的程式碼,定時器 clear

jsbindcall

bind:改變this的指向空間 var name = 'sally'; function sayName() { return this.name; } function sayName2() { return this.name } var o = { 'name

QtQFtpQURL獲取帶有中文的檔名稱出現亂碼的解決方法

然後在工程的main函式中,QApplication app...下一行寫如下程式碼:     QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf8")); #ifdef Q_OS_WIN    

jQuerybindlive的區別

原文地址:http://blog.sina.com.cn/s/blog_4a60ba9c01013rgu.html Jquery中繫結事件有三種方法:以click事件為例    (1)target.click(function(){});    (2)target.

【轉】數據結構堆---內存分配

heap 元素 部分 程序 記錄 ptr 區域 sdn 頭部 一、數據結構的棧和堆 首先在數據結構上要知道堆棧,盡管我們這麽稱呼它,但實際上堆棧是兩種數據結構:堆和棧。堆和棧都是一種數據項按序排列的數據結構。 1)棧就像裝數據的桶或箱子 我們先從大家比較熟悉的棧說起吧

Python對象在內存是如何保存?

blog obj ges images tro 大致 idt 找到 創建對象 類以及類中的方法在內存中只有一份,而根據類創建的每一個對象都在內存中需要存一份,大致如下圖: 如上圖所示,根據類創建對象時,對象中除了封裝 name 和 age 的值之外,還會保存一個類對象指針

excelvba將excel數字圖表輸出到word

exe 如果 bmp view star path zed img delete 參考:https://wenku.baidu.com/view/6c60420ecc175527072208af.html 比如將選區變為圖片保存到桌面: 1 Sub 將選區轉為圖

js方法格式化數字加入千分符並可以指定小數點位數支援負數

//js方法格式化數字,加入千分符,並可以指定小數點位數 function number(s, n) { n = n >= 0 && n <= 20 ? n : 2; s = parseFloat((s + "").replace(/[^\d\.-]/

論 javaString new String還有物件的String字串在記憶體的儲存

一直以來,所有人都說,java中的String型別是不可變的,可是為什麼不可變確很少有人說的透徹,String和new String的區別,物件中的String和直接定義一個String是否有區別,一直都是一知半解。看了很多文件都是各種猜測,沒有具體程式碼來

MySQLinteractive_timeoutwait_timeout的區別 MySQLinteractive_timeoutwait_timeout的區別

MySQL中interactive_timeout和wait_timeout的區別   在用mysql客戶端對資料庫進行操作時,開啟終端視窗,如果一段時間沒有操作,再次操作時,常常會報如下錯誤: ERROR 2013 (HY000): Lost connect

JavaintInteger的區別:int 是基本型別直接存數值 ;integer是物件用一個引用指向這個物件

      int 是基本型別,直接存數值   integer是物件,用一個引用指向這個物件   1.Java 中的資料型別分為基本資料型別和複雜資料型別   int 是前者>>integer 是後者(也就是一個類)   2.初始化時>>   in

已知一個按先序序列輸入的字元序列如abc,,de,g,,f,,,(其中逗號表示空節點)。請建立二叉樹並按後序方式遍歷二叉樹最後求出葉子節點個數二叉樹深度。

這是一個標準的模板題 記下了就完事了! Input   輸入一個長度小於50個字元的字串。 Output 輸出共有4行: 第1行輸出中序遍歷序列; 第2行輸出後序遍歷序列; 第3行輸出葉子節點個數; 第4行輸出二叉樹深度。 Sample Input abc,,

javabigintegerbigdecimal在大數計算的使用

java中的BigInteger和BigIntegerDecimal 當我們在做Acm的大數題時,我們會發現int,double,表示的範圍有限,不能夠滿足要求,對於c/c++而言,我們就只能採用陣列

Windows 64位系統安裝Android SDK“系統找不到指定的檔案Java.exe”解決方法

首先請看這裡: http://blog.galois21.com/computer/galois21/2012_11_03/348 如果按照上面的步驟還無法解決。 那麼進入你自己的C:\Windows\System32目錄下,看看是不是有java.exe、javac.e

今天遇到一個怪異的問題maven生成專案war包有一個Jar包不是我指定的版本執行時會找不到符號o(╥﹏╥)o

我要求的jar包:   這是我parent專案中pom檔案的依賴管理   這是我要生成war包那個工程最後依賴的jar包,這個時候它們的版本號還是一致的   最後專案生成的:   下圖是Dmaven.test.skip=true 跳過測試(同時會跳過test compile)生成的

oracle建立一個使用者只能檢視指定的檢視如何授權建立別名

1.create user A identified by password,建立使用者,使用者名稱是A,密碼是password create user  USER_JWFZ identified by JWFZ2017; 2.grant connect to A --授

python的a+模式下寫入不支援指定位置寫入只能在最後累加

先使用a+的模式儲存在檔案中寫一段程式碼,並列印目前的指標位置:f = open('test.txt', 'a+', encoding='utf-8') f.write('123456789\n') f.write('987654321\n') # 得到f檔案現在的指標 p

js的call()apply()方法

-m spa script apply() obj cli nbsp val glob 1.call() 語法:obj1.call(obj2[,param1,param2,...])定義:用obj2對象來代替obj1,調用obj1的方法。即將obj1應用到obj2上。說明:

JS的call()apply()方法區別

prototype 理解 ace attach bdb .html closed mil solid 如 果沒接觸過動態語言,以編譯型語言的思維方式去理解javaScript將會有種神奇而怪異的感覺,因為意識上往往不可能的事偏偏就發生了,甚至覺得不可 理喻.如果在學Java