摘要:基本用法在中允許使用來定義函數(shù),如下就等同于從上面可以看出,在箭頭左側(cè)的是代表參數(shù),若參數(shù)只有一個,可以省略,箭頭右側(cè)的表示函數(shù)代碼塊,若代碼塊里面是個返回值,則可以省略不寫無參數(shù)情況若箭頭函數(shù)不需要參數(shù),則左側(cè)用代替,如下無參數(shù)情況無參數(shù)
基本用法
在ES6中允許使用 => 來定義函數(shù),如下:
var f = a => a; console.log(f(1)); //1
就等同于
var f = function(a){ return a; } console.log(f(1)); //1
從上面可以看出,在箭頭左側(cè)的是代表參數(shù),若參數(shù)只有一個,()可以省略,箭頭右側(cè)的表示函數(shù)代碼塊,若代碼塊里面是個返回值,則{}可以省略不寫
1.無參數(shù)情況若箭頭函數(shù)不需要參數(shù),則左側(cè)用()代替,如下:
var f = () => { console.log("無參數(shù)情況"); } f();//無參數(shù)情況2.有參數(shù)情況
var f = (a, b) => { return a+b; } console.log(f(1,2)); //3
var f = a => a; console.log(f(1)); //1
如果箭頭函數(shù)有參數(shù),則需要用()括起來,若只有一個參數(shù),括號可以省略不寫
在這里要注意一個情況,就是當(dāng)箭頭函數(shù)直接返回一個對象的時候,如下:
var f = () => {name:"liming", age:22}; //報錯 console.log(f());
這樣寫肯定是報錯的,因為{}執(zhí)行時變成代碼塊,會去運行代碼,所以要用一個()括起來才可以,如下:
var f = () => ({name:"liming", age:22}); console.log(f());
執(zhí)行結(jié)果為:
{name: "liming", age: 22}
以上這個寫法才是正確的
箭頭函數(shù)注意點 1.this指向var a = "全局變量a"; var obj={ a:"局部變量a", fn1:function(){ console.log(this.a); }, fn2:()=>{ console.log(this.a); } } obj.fn1(); obj.fn2();
輸出結(jié)果為:
局部變量a 全局變量a
普通函數(shù)的this我們知道是指向最近的一個對象,而箭頭函數(shù)的this實際上是指向定義時的this,比如把上面代碼改為:
var obj={ a:"局部變量a", fn1:function(){ console.log(this.a); }, fn2:()=>{ console.log(this.a); } } obj.fn1(); obj.fn2();
輸出結(jié)果為:
局部變量a undefined
此時因為箭頭函數(shù)是指向全局的,全局沒有變量a則輸出undefined,這里的fn1和fn2都是全局函數(shù),所以箭頭函數(shù)this指向的是定義時的全局,而普通函數(shù)的this指向的是最近的一個對象
上面如果那個例子不太明白,可以再看下如下例子:
this.a = "全局a"; function Timer() { this.a = "timer中的a"; // 普通函數(shù) setTimeout(function () { console.log("普通函數(shù):", this.a); }); // 箭頭函數(shù) setTimeout(() => { console.log("箭頭函數(shù):",this.a); }); } new Timer();
輸出結(jié)果為:
普通函數(shù): 全局a 箭頭函數(shù): timer中的a
這里普通函數(shù)會指向全局是因為,距離普通函數(shù)最近的對象是setTimeOut,而setTimeOut是掛在全局作用域中,所以普通函數(shù)指向全局,箭頭函數(shù)指向的是定義時的對象,箭頭函數(shù)是在Timer中定義的,所以箭頭函數(shù)指向Timer
如果把以上代碼改為如下:
this.a = "全局a"; function Timer() { this.a = "timer中的a"; // 普通函數(shù) setTimeout(function () { console.log("普通函數(shù):", this.a); }); // 箭頭函數(shù) setTimeout(() => { console.log("箭頭函數(shù):",this.a); }); } Timer();
輸出結(jié)果:
普通函數(shù): timer中的a 箭頭函數(shù): timer中的a
這個是為什么呢,因為如果是new Timer相當(dāng)于是構(gòu)造函數(shù),構(gòu)造了一個對象,如果是Timer()就相當(dāng)于是調(diào)用函數(shù)Timer()這兩者還是有區(qū)別的,如果是調(diào)用函數(shù)Timer(),這個時候this的指向都是全局,在局部修改this.a會覆蓋全局的this.a
通過以上,我們可以知道普通函數(shù)跟箭頭函數(shù)this指向的區(qū)別是:
普通函數(shù): this指向最靠近的一個對象
箭頭函數(shù): this指向定義時的對象,也就是說箭頭函數(shù)一旦定義完成,它的指向是固定的,沒法改變,它的指向是定義時所在的作用域,而不是執(zhí)行時的作用域
2.不可以當(dāng)做構(gòu)造函數(shù)箭頭函數(shù)不可以當(dāng)做構(gòu)造函數(shù),也就是不可以new一個,否則會報錯,如下:
var fn = ()=>{ console.log("123"); } new fn(); //Uncaught TypeError: fn is not a constructor
以上會報錯,因為箭頭函數(shù)本身沒有屬于自己的this,所以箭頭函數(shù)不可以當(dāng)做構(gòu)造函數(shù),也因為箭頭函數(shù)沒有自己的this,所以call()、apply()、bind()這些方法去改變this的指向?qū)^函數(shù)也是無效的,如下:
this.x = "outer"; (function() { console.log([ (() => this.x).bind({ x: "inner" })() ]); })();
輸出結(jié)果為:
["outer"]
把箭頭函數(shù)通過bind綁定可見無效,箭頭函數(shù)還是指向全局
以上是個人總結(jié),有什么不足之處歡迎留言探討!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/95719.html
前言 今天就簡單總結(jié)一下promise的用法,在用promise之前,我們要先了解一下什么promise,這個東西是用來干什么的? 通俗易懂的講,promise其實就是一個構(gòu)造函數(shù),是用來解決異步操作的,我們平時其實還是會用到挺多的,比如我們經(jīng)常會嵌套一層層的函數(shù) step1(function (value1) { step2(value1, function(value2){ s...
摘要:真正被賦值的是后者,而不是前者。第一行語句中,模式是取數(shù)組的第一個成員,跟圓括號無關(guān)第二行語句中,模式是,而不是第三行語句與第一行語句的性質(zhì)一致。本文參考鏈接主要是看了阮一峰老師的文章,自己整理了一下,供后期自己看筆記用的 1.數(shù)組的解構(gòu)賦值 我們知道以前我們給一個變量賦值要這樣如下: let a = 1; let b = 2; let c = 3; 但是ES6出來之后,我們可以這樣:...
摘要:命令新增了命令,跟類似,都是用來聲明變量的不允許重復(fù)聲明報錯不存在變量提升報錯正確寫法為既要先定義,后面才能有這個值,否則會報錯,如果改成會提示未定義,但是就直接報錯了暫時性死區(qū)只要在塊級作用域里面存在則它所聲明的變量就綁定在這個塊級作用域 let命令 ES6新增了let命令,跟var類似,都是用來聲明變量的 1.不允許重復(fù)聲明 { let a = 1; let a =...
摘要:當(dāng)控制流遇到這樣的語句時,它立即跳出當(dāng)前函數(shù)并將返回的值賦給調(diào)用該函數(shù)的代碼。函數(shù)聲明不是常規(guī)的從上到下的控制流的一部分。該函數(shù)調(diào)用控制臺的來完成它的工作,然后將控制流返回到第行。 來源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項目原文:Functions 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 自豪地采用谷歌翻譯 部分參考了《JavaScript ...
摘要:事件與節(jié)點每個瀏覽器事件處理器被注冊在上下文中。事件對象雖然目前為止我們忽略了它,事件處理器函數(shù)作為對象傳遞事件對象。若事件處理器不希望執(zhí)行默認行為通常是因為已經(jīng)處理了該事件,會調(diào)用事件對象的方法。 來源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項目原文:Handling Events 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 自豪地采用谷歌翻譯 部分...
閱讀 1295·2021-09-26 09:55
閱讀 3326·2019-08-30 15:55
閱讀 1042·2019-08-30 15:53
閱讀 2346·2019-08-30 13:59
閱讀 2443·2019-08-29 13:08
閱讀 1159·2019-08-29 12:19
閱讀 3391·2019-08-26 13:41
閱讀 470·2019-08-26 13:24