您好,登錄后才能下訂單哦!
這篇文章主要講解了es6函數中的作用域的用法,內容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。
一旦設置了參數的默認值,函數進行聲明初始化時,參數會形成一個單獨的作用域(context)。等到初始化結束,這個作用域就會消失。這種語法行為,在不設置參數默認值,是不會出現的。
var x = 1; function f(x, y = x) { console.log(y); } f(2) // 2
上面的代碼中,參數y的默認值等于變量x。調用函數f時,參數形成一個單獨的作用域。在這個作用域里面,默認值變量x指向第一個參數x,而不是全局變量x,所以輸出是2。
再看下面的例子。
let x = 1; function f(y = x) { let x = 2; console.log(y) }
上面代碼中,函數f調用時,參數y = x形成一個單獨的作用域,這個作用域里面,變量x本身沒有定義,所以指向外層的全局變量x。函數調用時,函數體內部的局部變量x影響不到默認值變量x。
如果此時,全局變量x不存在,就會報錯。
function f(y = x) { let x = 2; console.log(y) } f() // ReferenceError: x is not defined
下面這樣寫,也會報錯。
var x = 1; function foo(x = x) { // ... } foo() // ReferenceError: x is not defined
上面代碼中,參數x = x形成一個單獨作用域,實際執行的是 let x = x,由于暫時性死區的原因,這行代碼會報錯"x未定義"。
如果參數的默認值是一個函數,該函數的作用域也遵守這個規則。請看下面的例子。
let foo = 'outer' function bar(func = () => foo) { let foo = 'inner'; console.log(func()) } bar() // outer
上面代碼中,函數bar的參數func的默認值是一個匿名函數,返回值是變量foo。函數參數形成的單獨的作用域里面,并沒有定義變量foo,所以foo指向外層的全局變量foo,因此輸出outer。
如果寫成下面這樣,就會報錯。
function bar (func = () => foo) { let foo = 'inner' console.log(func()) } bar() // ReferenceError: foo is not defined
上面代碼中,匿名函數里面的foo指向函數外層,但是函數外層并沒有聲明變量foo,所以報錯了。
下面是一個更復雜的例子。
var x = 1; function foo(x, y = function() {x = 2;}) { var x = 3; y() console.log(x) } foo() // 3 x // 1
上面代碼中,函數foo的參數形成一個單獨作用域。這個作用域里面,首先聲明了變量x,然后聲明了變量y,y的默認值是一個匿名函數。這個匿名函數內部的變量x, 指向同一個作用域的第一個參數x。函數foo內部又聲明了一個內部變量。該變量與第一個參數x由于不是同一個作用域,所以不是同一個變量,因此執行y后,內部變量x和外部全局變量x的值都沒變。
如果將var x = 3的var 去除,函數foo的內部變量x就指向第一個參數,與匿名函數內部的x是一致的,所以最后輸出的就是2,而外層的全局變量x依然不受影響。
看完上述內容,是不是對es6函數中的作用域的用法有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。