理解 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
JS中setInterval()和clearInterval()的使用以及注意事項 (實用,贊)
原文出處:https://blog.csdn.net/YDesire/article/details/81124331 延伸閱讀:clearInterval(timer)和timer = null的區別 setInterval(): 間隔指定的毫秒數不停地執行指定的程式碼,定時器 clear
js的bind和call
bind:改變this的指向空間 var name = 'sally'; function sayName() { return this.name; } function sayName2() { return this.name } var o = { 'name
Qt中QFtp和QURL獲取帶有中文的檔名稱出現亂碼的解決方法
然後在工程的main函式中,QApplication app...下一行寫如下程式碼: QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf8")); #ifdef Q_OS_WIN
jQuery中bind和live的區別
原文地址: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 的值之外,還會保存一個類對象指針
excel中vba將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\.-]/
論 java中String 和 new String還有物件中的String字串在記憶體中的儲存
一直以來,所有人都說,java中的String型別是不可變的,可是為什麼不可變確很少有人說的透徹,String和new String的區別,物件中的String和直接定義一個String是否有區別,一直都是一知半解。看了很多文件都是各種猜測,沒有具體程式碼來
MySQL中interactive_timeout和wait_timeout的區別 MySQL中interactive_timeout和wait_timeout的區別
MySQL中interactive_timeout和wait_timeout的區別 在用mysql客戶端對資料庫進行操作時,開啟終端視窗,如果一段時間沒有操作,再次操作時,常常會報如下錯誤: ERROR 2013 (HY000): Lost connect
Java中int和Integer的區別: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,,
java中biginteger和bigdecimal在大數計算中的使用
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