溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

es6函數(shù)中的作用域的用法

發(fā)布時間:2020-08-03 09:38:47 來源:億速云 閱讀:138 作者:小豬 欄目:web開發(fā)

這篇文章主要講解了es6函數(shù)中的作用域的用法,內(nèi)容清晰明了,對此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會有幫助。

一旦設(shè)置了參數(shù)的默認(rèn)值,函數(shù)進(jìn)行聲明初始化時,參數(shù)會形成一個單獨(dú)的作用域(context)。等到初始化結(jié)束,這個作用域就會消失。這種語法行為,在不設(shè)置參數(shù)默認(rèn)值,是不會出現(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ù)形成一個單獨(dú)的作用域。在這個作用域里面,默認(rèn)值變量x指向第一個參數(shù)x,而不是全局變量x,所以輸出是2。

再看下面的例子。

let x = 1;

function f(y = x) {
 let x = 2; 
 console.log(y)
}

上面代碼中,函數(shù)f調(diào)用時,參數(shù)y = x形成一個單獨(dú)的作用域,這個作用域里面,變量x本身沒有定義,所以指向外層的全局變量x。函數(shù)調(diào)用時,函數(shù)體內(nèi)部的局部變量x影響不到默認(rèn)值變量x。

如果此時,全局變量x不存在,就會報(bào)錯。

function f(y = x) {
 let x = 2;
 console.log(y)
}

f() // ReferenceError: x is not defined

下面這樣寫,也會報(bào)錯。

var x = 1;

function foo(x = x) {
 // ...
}

foo() // ReferenceError: x is not defined

上面代碼中,參數(shù)x = x形成一個單獨(dú)作用域,實(shí)際執(zhí)行的是 let x = x,由于暫時性死區(qū)的原因,這行代碼會報(bào)錯"x未定義"。

如果參數(shù)的默認(rèn)值是一個函數(shù),該函數(shù)的作用域也遵守這個規(guī)則。請看下面的例子。

let foo = 'outer'

function bar(func = () => foo) {
 let foo = 'inner';
 console.log(func())
}

bar() // outer

上面代碼中,函數(shù)bar的參數(shù)func的默認(rèn)值是一個匿名函數(shù),返回值是變量foo。函數(shù)參數(shù)形成的單獨(dú)的作用域里面,并沒有定義變量foo,所以foo指向外層的全局變量foo,因此輸出outer。

如果寫成下面這樣,就會報(bào)錯。

function bar (func = () => foo) {
 let foo = 'inner'
 console.log(func())
}

bar() // ReferenceError: foo is not defined

上面代碼中,匿名函數(shù)里面的foo指向函數(shù)外層,但是函數(shù)外層并沒有聲明變量foo,所以報(bào)錯了。

下面是一個更復(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ù)形成一個單獨(dú)作用域。這個作用域里面,首先聲明了變量x,然后聲明了變量y,y的默認(rèn)值是一個匿名函數(shù)。這個匿名函數(shù)內(nèi)部的變量x, 指向同一個作用域的第一個參數(shù)x。函數(shù)foo內(nèi)部又聲明了一個內(nèi)部變量。該變量與第一個參數(shù)x由于不是同一個作用域,所以不是同一個變量,因此執(zhí)行y后,內(nèi)部變量x和外部全局變量x的值都沒變。

如果將var x = 3的var 去除,函數(shù)foo的內(nèi)部變量x就指向第一個參數(shù),與匿名函數(shù)內(nèi)部的x是一致的,所以最后輸出的就是2,而外層的全局變量x依然不受影響。

看完上述內(nèi)容,是不是對es6函數(shù)中的作用域的用法有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

es6
AI