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