搜尋
首頁web前端js教程實例講解JavaScript函數綁定用法

實例講解JavaScript函數綁定用法

Dec 21, 2017 am 10:17 AM
javascriptjs綁定

本文主要介紹了JavaScript函數綁定用法,結合實例形式分析了javascript函數綁定的原理、實現方法與相關操作技巧,需要的朋友可以參考下,希望能幫助到大家。

Perface

#如果讓你實現這個頁面和一些操作的,例如點擊1、2 、3等就在那個input text中顯示,還有刪除功能,撥打我們先不要管它,只是模擬而已。要是我剛開始做的話,我會這樣做:

1. 用css、HTML佈局那個介面

2. 用javascript的事件委託監聽那個按鈕的父節點的點擊事件

但是如果我想用物件導向的想法做呢?我是用Ext做的,所以我想說的是它幫我封裝了很多。可能有些沒用過Ext的人不太了解我下面貼的程式碼,但我會盡量解釋清楚的!

Description


ContactTelPanel =Ext.extend(Ext.Panel, {
  //构造方法
  constructor : function(config) {
    Ext.apply(this, config);//直接把config对象的属性全复制到this对象中
    Parent = this.parent;
    var me = this;
    ContactTelPanel.superclass.constructor.call(this, {//用ContactTelPanel的父类也就是Ext.Panel的构造函数
      autoScroll : true,
      title : "拨打电话",//设置title,跟这篇文章的主体没关系,不要管他
      id : "contacttelpanel",
      bodyStyle : "padding: 30px 300px;",
      defaults : {//可以为该对象(ContactTelPanel)包含的组件(也就是在items配置选项)设置一些相同属性
        layout : "column",
        defaults : {
          xtype : "button",
          width : 50,
          height : 25,
          style : "margin:4px 15px",
          handler : this.press //为每个按钮都添加一个click的事件
        },
        bodyBorder : false
      },
      items : [ {//textfield组件
        height : 30,
        width : 250,
        xtype : "textfield",
        id : "tf",
        style : "margin-bottom:10px"
      }, {// 没有xtype就是默认为panel,下面也是,不然就不要纠结了,直接在这里想象成第一行按钮1、按钮2、按钮3
        items : [ {
          text : "1"
        }, {
          text : "2"
        }, {
          text : "3"
        } ]
      }, {// 这里是按钮4、按钮5、按钮6
        items : [ {
          text : "4"
        }, {
          text : "5"
        }, {
          text : "6"
        } ]
      }, {// 这里是按钮7、按钮8、按钮9 下同
        items : [ {
          text : "7"
        }, {
          text : "8"
        }, {
          text : "9"
        } ]
      }, {
        items : [ {
          text : "*"
        }, {
          text : "0"
        }, {
          text : "#"
        } ]
      }, {
        items : [ {
          text : "拨打",
        }, {
          text : "删除",
        } ]
      } ]
    });
  },
  press : function() {
    var text = this.text, textfield = Ext.getDom("tf");
    if (/[0-9*#]/.test(text)) {//在textfield中显示所点击按钮的数字
      textfield.value += text;
    } else if (this.text == "删除") {//删除功能
      textfield.value = textfield.value.slice(0, -1);
    } else if (this.text == "拨打") {//这个先不要管他
      Tel.telcall(textfield.value);
    }
  }
});

註:其實從上面可以知道ContactTelPanel是繼承Ext.Panel,然後這個面板中有很多個鍵,每個鍵都監聽click事件。確實在這裡覺得自己敲得不是很好,應該是用事件委託來實現,因為你每個按鈕都監聽了click事件,太影響效率了。用事件委託我們可以指監聽它的父節點的click事件就行了,然後根據事件流來判斷目的對象並操作。本文重點還是監聽事件裡面handler : this.press這段程式碼中 。我遇見的問題就是如果我在press函數要用到這個類別ContactTelPanel的一些屬性,該怎麼辦?

Idea

我在想,我想要在press函數中用到這個類別的屬性,我直接在press上用this物件來取得不就行了,但是我錯了,例如你在press函數中console.dir(this),看chrome控制台出現的是什麼?不幸的是它出現的是Button對象,它的this指針改了。確實有點麻煩,然後我就想了三個方法,如下:

Solution

1 在每個監聽事件的函數中傳參考

程式碼handler : this.press(this),然後在press函數體內寫alert(arguments[0])

出現的情況:確實在這個頁面載入的時候就彈出視窗是ContactTelPanel,但是你點擊那些按鈕的時候它沒出現了

原因this.press(this),這樣子寫javascript解析器會當作呼叫press函數,然後在你載入頁面就執行了

2 在這個ContactTelPanel類別中設定全域變數

程式碼:例如在第五行設定me = this,然後在press函數體中寫alert(me)

出現的情況:確實可以在點擊按鈕的時候彈出窗口,成功了

缺點:污染全域變量,容易被別人無意篡改。例如我在引入這個頁面的js後面再引用其他js的時候,在後面的js中設定var me = "monkindey",那麼你再點擊那個頁面的按鈕的時候它會彈出123,為不是ContactTelPanel物件

3 簡單運用了閉包

代碼handler : function(){me.press(me)} 註:me就是ContactTelPanel對象,因為在function中this指標已經是button物件了,所以應該在function外面用me(或其他變數名稱)保存this對象,即var me = this

出現的情況:這當然是成功

4 用call來實作函數綁定

程式碼handler : function(){ me.press.call(this,me );}

個人覺得:這個應該才是最好用的

另:前面一篇詳解JavaScript函數綁定介紹了基於純js的函數綁定技術,有興趣的讀者可對照一下二者的異同。

相關推薦:

javascript互動如何使用函數綁定程式碼詳解

#js使用函數綁定技術改變事件處理程序的作用域_javascript技巧

詳解JavaScript函數綁定_基礎知識

以上是實例講解JavaScript函數綁定用法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Python vs. JavaScript:社區,圖書館和資源Python vs. JavaScript:社區,圖書館和資源Apr 15, 2025 am 12:16 AM

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

從C/C到JavaScript:所有工作方式從C/C到JavaScript:所有工作方式Apr 14, 2025 am 12:05 AM

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

JavaScript引擎:比較實施JavaScript引擎:比較實施Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

超越瀏覽器:現實世界中的JavaScript超越瀏覽器:現實世界中的JavaScriptApr 12, 2025 am 12:06 AM

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

使用Next.js(後端集成)構建多租戶SaaS應用程序使用Next.js(後端集成)構建多租戶SaaS應用程序Apr 11, 2025 am 08:23 AM

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

如何使用Next.js(前端集成)構建多租戶SaaS應用程序如何使用Next.js(前端集成)構建多租戶SaaS應用程序Apr 11, 2025 am 08:22 AM

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

JavaScript:探索網絡語言的多功能性JavaScript:探索網絡語言的多功能性Apr 11, 2025 am 12:01 AM

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

JavaScript的演變:當前的趨勢和未來前景JavaScript的演變:當前的趨勢和未來前景Apr 10, 2025 am 09:33 AM

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具