1. 程式人生 > >一步一步學習TypeScript(11.Arrow Functions_箭頭函式➹)

一步一步學習TypeScript(11.Arrow Functions_箭頭函式➹)

單拿出這一節詳細說一下箭頭函式(也就是lambda表示式)在TypeScript中的用法.
lambda表示式(()=>{something}()=>something)相當於js中的函式,它的好處是可以自動將函式中的this附加到上下文中.具體原理下面會講到. (在其它js的函式庫中基本都有繫結this到上下文的方法,如jQuery中的 proxy函式.)
例如:

function Arrow(age){
    this.age = age;

    this.add= function(){
        this.age ++;
        console.log(this
.age); } } var arrow2 = new Arrow(10); setTimeout(arrow2.add, 1000); //期望值為11, 結果卻是NaN.

原因是setTimeout執行的上下文環境為window,使得add方法中的this脫離了原上下文而指向了window.
現在對上例子使用箭頭函式改造一下

function Arrow1(age){
    this.age = age;

    this.add= ()=>{
        this.age ++;
        console.log(this.age);
    }
}

var arrow2 = new
Arrow1(10); setTimeout(arrow2.add, 1000); //11, 結果正確

開啟ts編譯後的js程式碼

function Arrow1(age) {
    var _this = this;   //自動建立了一個_this變數,指向了當前上下文.
    this.age = age;
    this.add = function () {
        _this.age++; //在這裡程式使用的是之前建立的_this中儲存的上下文環境,而不是`this`
        console.log(_this.age);
    };
}

var arrow2 = new
Arrow1(10); setTimeout(arrow2.add, 1000);

這下我就知道為何使用箭頭函式後得出正確的結果了.
現在我們可以把上面的例子變的更typescript一些.

class Arrow{
    constructor(public age:number){}

    add = ()=>{
        this.age ++;
        console.log(this.age);
    }
}

var arrow = new Arrow(10);
setTimeout(arrow.add, 1000); // 11

注意: 箭頭函式中的陷阱
1. 如果你想使用this為當前呼叫時的上下文時不要使用箭頭函式.因為箭頭函式會把this繫結到定義函式時的上下文環境.
2. 如果你正使用一些回撥函式時請小心使用箭頭函式.例如 jquery, underscore, 等. 這些函式庫通常在回撥函式中指明瞭this特殊意義如jquery中簡單的each方法

$("li").each(function(){
    alert($(this).text())
});

上例中的this實際代表每個li的dom物件,如果使用箭頭函式則會得到錯誤結果,在者一般回撥函式會在回撥方法中放置引數(arguments)還是用each舉例$(selector).each(function(index,element)),如果你想使用indexelement這些引數,也請不要使用箭頭函式.還是直接寫function吧,可以這麼使用:

let _self = this;
something.each(function(){
    console.log(_self); // 定義方法時的上下文
    console.log(this);  // 執行時另種庫指定的上下文
}); 

相關推薦

學習TypeScript(11.Arrow Functions_箭頭函式➹)

單拿出這一節詳細說一下箭頭函式(也就是lambda表示式)在TypeScript中的用法. lambda表示式(()=>{something}或()=>something)相當於js中的函式,它的好處是可以自動將函式中的this附加到上下文中.具體

ECMAScript 6 學習系列課程 (ES6 箭頭函式的使用)

在ES6語法中,簡化了對函式的書寫,其實,最初並不適應這樣的寫法,感覺很奇怪,但是永久了,發現這種方式更加直觀,如果有了解swift語法的一定對箭頭函式不陌生。 下面我們來看一下這個箭頭函式在ES6中是如何應用的: odds = evens.map(v

學習ASP.NET 5 (五)- TypeScript

       編者語 : 人總會多次犯錯,歷史上告誡大家不要在演講前更新最新版本的軟體,但週末我又一次錯了......好吧下次我堅決錄屏。本來約好週日和大家見,但深圳回來後又是各種的會議耽擱到現在真的

跟我學習lucene(11)---lucene搜尋之高亮顯示highlighter

highlighter介紹 這幾天一直加班,部落格有三天沒有更新了,望見諒;我們在做查詢的時候,希望對我們自己的搜尋結果與搜尋內容相近的地方進行著重顯示,就如下面的效果 這裡我們搜尋的內容是“一步一步跟我學習lucene”,搜尋引擎展示的結果中對使用者的輸入資訊進行了配色方

學習TypeScript(08.隱式/顯示型別轉換)

implicit/explicit cast (隱式/顯示型別轉換) TypeScript中可以顯示錶明物件的型別 . 轉換一個型別到其它型別時可以使用<>符號, 如 <T&g

學習TypeScript(09.enums_列舉)

Enums enum Color { Red, Green, Blue } var colorValue = Color.Red; colorValue = "2"; //錯誤, enum 值為number型別,並且是從0

跟我學習hadoop(5)----hadoop Map/Reduce教程(2)

submit calc run submitjob des conf sam ner 打開 Map/Reduce用戶界面 本節為用戶採用框架要面對的各個環節提供了具體的描寫敘述,旨在與幫助用戶對實現、配置和調優進行具體的設置。然而,開發時候還是要相應著API進行

學習Vue(十

head move 就會 基本 參數 mode onclick set stat 本篇繼續學習vuex,還是以實例為主;我們以一步一步學Vue(四)中講述的例子為基礎,對其改造,基於vuex重構一遍,這是原始的代碼: todolist.js ; (functio

學習IdentityServer3 (13) 令牌

jwt poi 信息 定義 icu 客戶 不同 env res IdentityServer3中客戶端保護了授權資源,不難看出在IdentityServer3中,有這樣一個設置 AllowedScopes = new List<string>

學習IdentityServer4 (4) 處理特殊需求之-登錄等待頁面

友好 添加 href 空白頁 gpo nsf sha256 init 處理 用IdentityServer3的時候登錄如果采用Post方式大家會發現有中間有一個等待Submit空白頁面,界面不友好,現在我想把這個修改自定義的頁面Loading 在Identityserve

C# 異編程學習

apm 結果 mic public b- num row worker inf 異步 編程 可在 等待 某個 任務 完成時, 避免 線程 的 占用, 但要 想 正確地 實現 編程, 仍然 十分 傷腦筋。 . NET Framework 中, 有三種 不同 的 模型 來 簡化

學習spring】spring bean管理(上)

proto id屬性 table handle isp 基礎上 turn 聲明 設置方法 1. spring 工廠類 我們前邊的demo中用到的spring 工廠類是ClassPathXmlApplicationContext,從上圖可以看到他還有一個兄弟類FileSys

學習JNI

動態鏈接 下載 默認 .class 學習 什麽 jdk 產品 用戶 本文來自網易雲社區作者:孫有軍前言本篇的主要目的就是JNI開發入門,使大家對JNI開發流程有一個大致的了解,後續再進行深入學習。JNI不是Android特有的,JNI是Java Native Interfa

java學習知識點

一、資料結構與演算法基礎 說一下幾種常見的排序演算法和分別的複雜度。 用Java寫一個氣泡排序演算法 描述一下鏈式儲存結構。 如何遍歷一棵二叉樹? 倒排一個LinkedList。 用Java寫一個遞迴遍歷目錄下面的所有檔案。 二、Java基礎 介面

學習Android TV/盒子開發(三)

本文主要說的就是在TV開發中常遇到的問題總結 焦點丟失問題 在使用ListView、GridView及RecyclerView時有時會出現,這時需要在xml中,新增 android:descendantFocusability="afterDescendants" 1

學習Android TV/盒子開發(二)

TV、機頂盒開發除錯不能像手機一樣通過USB線連線除錯,可通過ADB連線除錯 連線電視 adb connect 10.74.84.199 1 2 連線後就可以開始開發除錯了! 斷開連線 // 斷開某個裝置 adb disconnect 10.74.84

學習Android TV/盒子開發(

寫在前面的話: 本人做了幾年的機頂盒和Android電視上的應用開發,寫這些文章只是為了讓初次接觸大屏開發的同學能夠快速上手。 TV端因為沒有觸控操作,只有遙控操作,所以焦點處理、控制以及按鍵監聽是其主要特點。 焦點處理 設定可獲取焦點 佈局中需要設定某個控制元件可獲取焦點需要加

利用 TensorFlow 構建一個多工學習模型

  介紹 為什麼是多工學習? 當你在思考新事物的時候,他們通常會利用他們以前的經驗和獲得的知識來加速現在的學習過程。當我們學習一門新語言的時候,尤其是相關的語言時,我們通常會使用我們一級學過的語言知識來加快這一門新語言的學習過程。這個過程也可以用另一種方式來理解 —— 學習一種

學MySQL----11 MySQL支援的統計函式

11.1 統計資料記錄條數—-count() 統計函式count()用來實現統計資料記錄條數。 count(*):該方式可以實現對錶中記錄進行統計,不管表字段中包含的是NULL值還是非NULL值 count(field):該方式可以實現對指定欄位的記錄進行統計,在具

學習UML(3)-時序圖

1、時序圖簡介 時序圖(Sequence Diagram),又名序列圖、循序圖,是物件之間互動的UML互動圖,這些物件是按時間順序排列的。時序圖中建模元素主要有:角色(Actor)、物件(Object)、生命線(Lifeline)、控制焦點(Focus of c