1.函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別师郑?
(1)函數(shù)聲明:
<script>
function() {
alert("hello, world.");
};
</script>
(2)函數(shù)表達(dá)式:
<script>
var foo = function() {
alert("hello, world.");
};
</script>
區(qū)別:
類似于var聲明环葵,函數(shù)聲明可以提升到其他代碼之前,但函數(shù)表達(dá)式不能提到其他代碼之前宝冕,但它允許保留在本地變量范圍內(nèi)张遭。
2.什么是聲明前置?
在JS中地梨,function和var會(huì)被提升帝璧,將聲明移至作用域scope(全局域或者當(dāng)前函數(shù)作用域)頂部。
3.求n!湿刽,用遞歸來(lái)實(shí)現(xiàn)
<script type="text/javascript">
function f(n){
if(n == 1){
return 1;
}
else{
return n*f(n-1);
}
}
</script>
4.什么是立即執(zhí)行的函數(shù)表達(dá)式?有什么作用褐耳?
(1)
立即執(zhí)行函數(shù)(Immediately-Invoked Function Expression)诈闺,簡(jiǎn)稱IIFE。主要有2種寫法:
(function(){
...
})();
(function(){
...
}());
(2)
通常情況下铃芦,只對(duì)匿名函數(shù)使用這種“立即執(zhí)行的函數(shù)表達(dá)式”雅镊。它的目的有兩個(gè):
- 一是不必為函數(shù)命名,避免了污染全局變量刃滓;
- 二是IIFE內(nèi)部形成了一個(gè)單獨(dú)的作用域仁烹,可以封裝一些外部無(wú)法讀取的私有變量。
第5題
輸出:10
作用域鏈查找過(guò)程偽代碼:
/*
1.globalContext = {
AO: {
x: 10
foo: function(){}
bar: function(){}
}
}
bar.[[scope]] = globalContext.AO
foo.[[scope]] = globalContext.AO
2.barContext = {
AO: {
x: 30
foo: function(){}
},
Scope: bar.[[scope]] = globalContext.AO
}
3.fooContext = {
AO: {}
Scope: foo.[[scope]] = globalContext.AO
}
*/
第6題
輸出:30
作用域鏈查找過(guò)程偽代碼:
/*
1.globalContext = {
AO:{
x: 10
bar: function(){}
}
}
bar.[[scope]] = glocalContext.AO
2.barContext = {
AO: {
x: 30
foo: function(){}
}
Scope: bar.[[scope]] = glocalContext.AO
}
foo.[[scope]] = barContext.AO
3.fooContext = {
AO: {}
Scope: foo.[[scope]] = barContext.AO
}
*/
第7題
輸出:30
作用域鏈查找過(guò)程偽代碼:
/*
1.globalContext = {
AO: {
x: 10
bar: function(){}
}
}
bar.[[scope]] = globalContext.AO
2.barContext = {
AO: {
x: 30
function()
}
bar.[[scope]] = globalContext.AO
}
function().[[scope]] = barContext.AO
3.function = {
AO: {}
function().[[scope]] = barContext.AO
}
*/
第8題
輸出: undeifned 5 1 6 20 200
作用域鏈查找過(guò)程偽代碼:
/*
1.globalContext = {
AO: {
a: 1
fn: function(){}
fn3: function(){}
}
}
fn.[[scope]] = globalContext.AO
fn3.[[scope]] = globalContext.AO
2.fnContext = {
AO: {
a: undefined
fn2: function(){}
}
Scope: globalContext.AO
}
fn2.[[scope]] = fnContext.AO
3.fn3Context = {
AO: {}
scope: globalContext.AO
}
4.fn2Context = {
AO:{}
Scope: fnContext.AO
}
*/
第9題
輸出:2 2 3
明白了第一個(gè)foo()和bar()不是一個(gè)作用域咧虎,二者并不影響卓缰,所以第一個(gè)foo()和bar()輸出的值是一樣的,都輸出2。
文章著作權(quán)歸饑人谷_Ricky和饑人谷所有,轉(zhuǎn)載須說(shuō)明來(lái)源