函式與作用域

2021-10-04 04:30:51 字數 2767 閱讀 2937

函式宣告:

function

add(a,b)

return a+b;

}

函式表示式;
//function variable  函式變數

varadd

=function

(a,b)

//ief(immediately excuted function) 立即執行函式

(function()

)()//first-class function 作為返回值

return

function()

//nfe(named function expression) 命名式函式表示式

varadd

=function

foo(a,b)

變數與函式宣告前置

我們先來看看以下兩段**區別:

var num=

add(1,

2); console.

log(num)

;//result 3

function

add(a,b)

return a+b;

}

var num=

add(1,

2); console.

log(num)

;//error

varadd

=function

(a,b)

return a+b;

}

我們會發現後一種情況會出現報錯。

因為函式宣告與變數宣告會提前,前者把function的宣告提前了,後者只把var add提前了。

命名函式表示式

var

func

=function

nef();

alert

(func === nfe)

;//ie6-8會返回false,ie9+中nfe匿名函式是訪問不到的

//遞迴呼叫

varfunc

=function

nfe(

)

命名函式表示式作用較少,一般用於觀察呼叫棧,不給名字呼叫棧中就只是個匿名函式,不適合程式設計師除錯。

function構造器

var func =

newfunction

('a'

,'b'

,'console.log(a+b);');

func(1

,2);

//3var

func

=function

('a'

,'b'

,'console.log(a+b);');

func(1

,2);

//3

比較

函式宣告

函式表示式

函式構造器前置1

允許匿名11

立即呼叫11

在定義該函式的作用域通過函式名訪問

1沒有函式名

1全域性的this(瀏覽器)

console.

log(

this

.document === document)

;//true

console.

log(

this

=== window)

;//true

this

.a=37

; console.

log(window)

;//37

一般函式的this
functionf1(

) console.

log(f1(

)===window)

;//true

functionf1(

) console.

log(f1(

)===undefined)

;//true

作為物件方法的函式的this
var o =

} console.

log(o.f(

))//37

//js的this除開箭頭函式外都是執行時確定的

var o=

;function

independent()

o.f = independent;

console.

log(o.f(

))//37

構造器中的this
//直接呼叫myclass(),this指向的是window

function

myclass()

//函式如果沒有返回值則預設返回this

var o =

newmyclass()

; console.

log(o.a)

;//37

functionc2(

);} o=

newc2()

; console.

log(o.a)

;//38

arguments屬性具有函式的引數,arguments.length可以獲取實際引數個數。

function

foo(x,y,z)

foo(1,

2);

塊級作用域與函式作用域

函式作用域 變數在定義的環境中以及巢狀的子函式中處處可見 塊級作用域 變數在離開定義的塊級 後立即被 在es6之前,js的作用域只有兩種 函式作用域和全域性作用域。使用var宣告的變數,都存在變數提公升的過程。console.log a undefined console.log c undefin...

作用域與成員函式

作用域與成員函式 在基類和派生類中使用同一名字的成員函式,其行為與資料成員一樣 在派生類作用域中派生類成員將遮蔽基類成員。即使函式原型不同,基類成員也會被遮蔽。class base class child public base child c child cout 區域性作用域中宣告的函式不會過載...

函式作用域

有巢狀函式的時候有return x的返回函式x的位址,沒有的則為none def f1 n1 f1 print f1中 n1 def f2 n2 f2 def f3 n3 f3 print f3中 n3 print f2中 n2 return f3 return f2 r1 f1 print r1 ...