函式的引數作用域

2021-08-22 18:10:14 字數 1380 閱讀 6493

注意理解:

1、

var x = 1;

function f(x, y = x)

f(2) // 2

2、let x = 1;

function f(y = x)

f() // 1

3、function f(y = x)

f() // referenceerror: x is not defined

4、var x = 1;

function foo(x = x)

foo() // referenceerror: x is not defined

一旦設定了引數的預設值,函式進行宣告初始化時,引數會形成乙個單獨的作用域,等到初始化完成,這個作用域就會消失,這種語法在不設定預設引數時是不會出現的。

所以:1、在x為新增預設值,y設定預設值為x,這時這個x在外部作用域已經定義,就會將這個值賦值給y,y=1.同理所以2中y=1。3中x在外部函式並沒有被定義,再賦值給y就會報錯。4中,引數的執行順序是從左到右的,所以這句話相當於:let x=x;因此會報錯。

再看乙個更加複雜的例子:

var x = 1;

function foo(x, y = function() )

foo() // 3

x // 1

上面**中,函式foo的引數形成乙個單獨作用域。這個作用域裡面,首先宣告了變數x,然後宣告了變數yy的預設值是乙個匿名函式。這個匿名函式內部的變數x,指向同乙個作用域的第乙個引數x。函式foo內部又宣告了乙個內部變數x,該變數與第乙個引數x由於不是同乙個作用域,所以不是同乙個變數,因此執行y後,內部變數x和外部全域性變數x的值都沒變。

變化其中的一小部分:

var x = 1;

function foo(x, y = function() )

foo() // 2

x // 1

如果將var x = 3var去除,函式foo的內部變數x就指向第乙個引數x,與匿名函式內部的x是一致的,所以最後輸出的就是2,而外層的全域性變數x依然不受影響

詳細請看=>

函式引數,作用域

def foo x,y,args,a 1,b,kwargs print x,y print args print a print b print kwargs foo 1,2,3,4,5,b 8,c 4,d 5 1 2 3,4,5 18 後定義的引數,必須被傳值 有預設值的除外 且必須按照關鍵字實參...

函式 引數 變數作用域

一 函式引數 1.必須引數 必需引數須以正確的順序傳入函式。呼叫時的數量必須和宣告時的一樣。呼叫printme 函式,你必須傳入乙個引數,不然會出現語法錯誤 小括號內的就是引數 小括號內沒東西叫做無參,有叫有參 求任意三個數之和 在定義函式的時候小括號內寫的是變數名字,不需要賦值 在呼叫函式的時候小...

python 函式 引數 作用域

注意 一般 args與 kwargs一起使用,這是超級無敵萬能引數 1.常見形參模式 def func1 a1,a2 pass def func2 a1,a2 none pass def func3 args,kwargs pass 2.位置引數永遠在關鍵字引數之前 作用域中查詢資料規則 優先查詢自...