新聞中心
這篇文章主要講解了es6函數(shù)中的作用域的用法,內(nèi)容清晰明了,對(duì)此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會(huì)有幫助。
為海興等地區(qū)用戶(hù)提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及海興網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、海興網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專(zhuān)業(yè)、用心的態(tài)度為用戶(hù)提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶(hù)的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
一旦設(shè)置了參數(shù)的默認(rèn)值,函數(shù)進(jìn)行聲明初始化時(shí),參數(shù)會(huì)形成一個(gè)單獨(dú)的作用域(context)。等到初始化結(jié)束,這個(gè)作用域就會(huì)消失。這種語(yǔ)法行為,在不設(shè)置參數(shù)默認(rèn)值,是不會(huì)出現(xiàn)的。
var x = 1; function f(x, y = x) { console.log(y); } f(2) // 2
上面的代碼中,參數(shù)y的默認(rèn)值等于變量x。調(diào)用函數(shù)f時(shí),參數(shù)形成一個(gè)單獨(dú)的作用域。在這個(gè)作用域里面,默認(rèn)值變量x指向第一個(gè)參數(shù)x,而不是全局變量x,所以輸出是2。
再看下面的例子。
let x = 1; function f(y = x) { let x = 2; console.log(y) }
上面代碼中,函數(shù)f調(diào)用時(shí),參數(shù)y = x形成一個(gè)單獨(dú)的作用域,這個(gè)作用域里面,變量x本身沒(méi)有定義,所以指向外層的全局變量x。函數(shù)調(diào)用時(shí),函數(shù)體內(nèi)部的局部變量x影響不到默認(rèn)值變量x。
如果此時(shí),全局變量x不存在,就會(huì)報(bào)錯(cuò)。
function f(y = x) { let x = 2; console.log(y) } f() // ReferenceError: x is not defined
下面這樣寫(xiě),也會(huì)報(bào)錯(cuò)。
var x = 1; function foo(x = x) { // ... } foo() // ReferenceError: x is not defined
上面代碼中,參數(shù)x = x形成一個(gè)單獨(dú)作用域,實(shí)際執(zhí)行的是 let x = x,由于暫時(shí)性死區(qū)的原因,這行代碼會(huì)報(bào)錯(cuò)"x未定義"。
如果參數(shù)的默認(rèn)值是一個(gè)函數(shù),該函數(shù)的作用域也遵守這個(gè)規(guī)則。請(qǐng)看下面的例子。
let foo = 'outer' function bar(func = () => foo) { let foo = 'inner'; console.log(func()) } bar() // outer
上面代碼中,函數(shù)bar的參數(shù)func的默認(rèn)值是一個(gè)匿名函數(shù),返回值是變量foo。函數(shù)參數(shù)形成的單獨(dú)的作用域里面,并沒(méi)有定義變量foo,所以foo指向外層的全局變量foo,因此輸出outer。
如果寫(xiě)成下面這樣,就會(huì)報(bào)錯(cuò)。
function bar (func = () => foo) { let foo = 'inner' console.log(func()) } bar() // ReferenceError: foo is not defined
上面代碼中,匿名函數(shù)里面的foo指向函數(shù)外層,但是函數(shù)外層并沒(méi)有聲明變量foo,所以報(bào)錯(cuò)了。
下面是一個(gè)更復(fù)雜的例子。
var x = 1; function foo(x, y = function() {x = 2;}) { var x = 3; y() console.log(x) } foo() // 3 x // 1
上面代碼中,函數(shù)foo的參數(shù)形成一個(gè)單獨(dú)作用域。這個(gè)作用域里面,首先聲明了變量x,然后聲明了變量y,y的默認(rèn)值是一個(gè)匿名函數(shù)。這個(gè)匿名函數(shù)內(nèi)部的變量x, 指向同一個(gè)作用域的第一個(gè)參數(shù)x。函數(shù)foo內(nèi)部又聲明了一個(gè)內(nèi)部變量。該變量與第一個(gè)參數(shù)x由于不是同一個(gè)作用域,所以不是同一個(gè)變量,因此執(zhí)行y后,內(nèi)部變量x和外部全局變量x的值都沒(méi)變。
如果將var x = 3的var 去除,函數(shù)foo的內(nèi)部變量x就指向第一個(gè)參數(shù),與匿名函數(shù)內(nèi)部的x是一致的,所以最后輸出的就是2,而外層的全局變量x依然不受影響。
看完上述內(nèi)容,是不是對(duì)es6函數(shù)中的作用域的用法有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
文章標(biāo)題:es6函數(shù)中的作用域的用法
分享鏈接:http://fisionsoft.com.cn/article/ippips.html