1,函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別
函數(shù)聲明的方式:調(diào)用放在聲明的前后都可以
函數(shù)表達(dá)式的方式:調(diào)用函數(shù)必須在函數(shù)表達(dá)式后面


2,什么是變量的聲明前置?什么是函數(shù)的聲明前置 ?
在執(zhí)行代碼之前,首先聲明同一個(gè)作用域的變量和函數(shù),然后再一句一句的執(zhí)行代碼
3,arguments是什么?
保存?zhèn)魅牒瘮?shù)的參數(shù) 數(shù)組 它是一個(gè)類數(shù)組的名字
4,函數(shù)的“重載”怎么實(shí)現(xiàn)?
不設(shè)置形參,沒有規(guī)定傳入?yún)?shù)的個(gè)數(shù)和類型


5,立即執(zhí)行函數(shù)表達(dá)式是什么?有什么作用
立即執(zhí)行函數(shù)表達(dá)式是什么?
有些時(shí)候需要在函數(shù)聲明后就立即使用該函數(shù),我們一般使用()例如 fn()來調(diào)用fn函數(shù)
那么function(){}()是不是就達(dá)到了聲明函數(shù)的同時(shí)就執(zhí)行函數(shù)了呢?結(jié)果:報(bào)錯(cuò)
為什么報(bào)錯(cuò)呢?
因?yàn)閒unction(){}是一條語句
當(dāng)然遇到function也可以看做是一個(gè)表達(dá)式 var a=function(){}
function后面才是表達(dá)式
由于()前面是不能跟一條語句的 所以function(){}()才會(huì)報(bào)錯(cuò)
要怎么解決這個(gè)問題呢?
不要讓function開頭
那么就有下面7種寫法:
(function(){}())
(function(){})()
! function(){}()
+function(){}()
-function(){}()
~ function(){}()
new function(){}()
通常情況下只對匿名函數(shù)使用立即執(zhí)行函數(shù)
有什么作用?
作用一:可以不必為函數(shù)起名字,避免了污染全局變量
作用二:立即執(zhí)行函數(shù)表達(dá)式形成了一個(gè)獨(dú)立的作用于,封裝的變量私有化
6,求n!,用遞歸來實(shí)現(xiàn)

7,以下代碼輸出什么?

輸出結(jié)果:
name:饑人谷
age:2
sex:男
["饑人谷",2,"男"]
name valley
name:小谷
age:3
sex:undefined
["小谷",3]
name valley
name:男
age:undefined
sex:undefined
["男"]
name valley
8,寫一個(gè)函數(shù),返回參數(shù)的平方和?

代碼:

執(zhí)行結(jié)果:

9,如下代碼的輸出?為什么

輸出:
undefined
報(bào)錯(cuò):b沒有定義
第一個(gè)結(jié)果undefined:同一個(gè)作用域的變量聲明前置,但是使用a在前,賦值a在后,所以輸出a時(shí)沒給a賦值 輸出undefined
第二個(gè)結(jié)果報(bào)錯(cuò):沒有聲明b變量
綜上所訴:聲明前置
10,如下代碼的輸出?為什么

輸出:
hello world
報(bào)錯(cuò)
原因:函數(shù)可以先使用后聲明,因?yàn)楹瘮?shù)前置,
函數(shù)表達(dá)式是一個(gè)表達(dá)式,要先聲明賦值再使用
11, 如下代碼輸出什么? 寫出作用域鏈查找過程偽代碼

輸出:
10
原因:
函數(shù)的作用域在它聲明的時(shí)候就決定了
作用域鏈查找過程偽代碼:

12, 如下代碼輸出什么? 寫出作用域鏈查找過程偽代碼

輸出結(jié)果:
30
作用域鏈的查找過程偽代碼:

13,以下代碼輸出什么? 寫出作用域鏈的查找過程偽代碼

輸出:
30
作用域鏈的查找過程偽代碼

14,以下代碼輸出什么? 寫出作用域鏈查找過程偽代碼

輸出結(jié)果:
undefined
5
1
6
20
200
作用域鏈查找過程偽代碼:

