函式宣告:
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
一般函式的thisfunctionf1(
) console.
log(f1(
)===window)
;//true
functionf1(
) console.
log(f1(
)===undefined)
;//true
作為物件方法的函式的thisvar 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 ...