一、函數(shù)聲明和函數(shù)表達式
函數(shù)聲明的形式:function fn() { } ,使用函數(shù)聲明的形式聲明一個函數(shù)時鸳粉,會先進行函數(shù)聲明前置,所以function聲明可以放在全局作用域中的任何一個位置园担,調(diào)用函數(shù)也不一定硬性要求一定要放在聲明函數(shù)之后届谈。函數(shù)表達式的形式: var fn= function() { } ,使用函數(shù)表達式聲明一個函數(shù)的時候弯汰,聲明前置和var無差艰山,就是先前置var fn ,所以后面要調(diào)用函數(shù)的時候,一定要在函數(shù)聲明后才能調(diào)用該函數(shù)咏闪。
二曙搬、變量的聲明前置和函數(shù)聲明前置
變量的聲明前置就是在解釋代碼時,先把 全局作用域的變量先提升到頭部 例如var a;
函數(shù)聲明前置就是在解釋代碼時鸽嫂,先把函數(shù)的聲明前置如 function fn ( );
函數(shù)內(nèi)部聲明前置是在執(zhí)行函數(shù)體時纵装,先前置函數(shù)內(nèi)部的所有聲明的變量;
三据某、argument?
argument 是一個類數(shù)組對象橡娄,但并不是一個數(shù)組對象;在函數(shù)體內(nèi)可以通過argument對象來訪問傳遞給該函數(shù)的所有參數(shù) 如argument[0]訪問第一個參數(shù)癣籽;argument[1] 訪問第二個參數(shù)挽唉,以此類推。
四筷狼、js函數(shù)沒有重載
在其他語言中瓶籽,例如C語言、JAVA語言等都有函數(shù)重載的功能埂材,就是定義兩個名字一樣的函數(shù)塑顺,但是函數(shù)的參數(shù)類型不一致,當再需要調(diào)用此函數(shù)時楞遏,會根據(jù)傳入到調(diào)用函數(shù)參數(shù)類型不同茬暇,自動地調(diào)用相關(guān)函數(shù)首昔。js沒有函數(shù)重載
五寡喝、立即執(zhí)行函數(shù)表達式
(function ( ) { })( ); 隔離作用域
六糙俗、用遞歸實現(xiàn) n! 的運算
遞歸就是在函數(shù)內(nèi)部自己調(diào)用自己
function ?factor(n) {
if(n ==1) {
return1;
}else{
returnn*factor ( n-1);
?}
}
八、寫一個函數(shù)輸出參數(shù)的平方和:
function ?sumOfSquare() {
var ? result=0;
for(vari=0;i < arguments.length;i++) {
result +=arguments[i]*arguments[i];
}
return result;
}
九预鬓、
console.log(a); ? ? // undefined
var ? ? a =1; ? console.log (b); ? ? //報錯
十巧骚、
sayName('world');
sayAge(10);
functionsayName(name){
console.log('hello ', name); ? ? ?//? hello? world
}
var ? ? sayAge =function(age){
console.log(age); ? ? ? ? //報錯,因為用函數(shù)表達式聲明函數(shù)格二,調(diào)用要在函數(shù)聲明后才能生效
};
十一劈彪、
var ? x =10;
bar() ??
function ? foo(){
console.log(x) ? ? ? ?//? ? 10
}
functionbar() {
var ?x =30
foo()
}
作用域鏈:
globalContext ={
AO { x:110,
foo:function() { },
bar:function( ) { }
}
scope:null
}
foo.[[scope]]=globalContext.AO
bar.[[scope]]=globalContext.AO
barContext ={
AO { x:30}
bar.[[scope]]=globalContext.AO
}
fooContext ={
AO {}
foo.[[scope]]=globalContext.AO
}
十二、
var ?x =10;
bar()
functionbar() {
var ?x =30;
functionfoo() {
? ?console.log(x); ? ?//30
}??
foo();
}
作用域鏈:
globalContext ={
AO {x: 10,
bar: function() { },
}
}
bar.[[scope]]=globalContext.AO
barContext ={
AO { x:30,}
foo: function() { },
}
bar.[[scope]]=globalContext.AO
}
foo.[[scope]]=barContext.AO
fooContext ={
AO { }顶猜,
foo.[[scope]]=barContext.AO
}
十三沧奴、
varx =10;bar()functionbar(){varx =30;? (function(){console.log(x)//30})()}
作用域鏈:
globalContext = {
AO {x:10,
bar:function() { }
}
}
bar.[[scope]]=globalContext.AO
barContext = {
AO { x: 30}
bar.[[scope]]=globalContext.AO
}
十四、
var ? a =1;
functionfn() ?{
console.log(a) ? ? ? ? ? //undefined
var ? ?a =5;
console.log? (a); ? ? ?//5
a++;
var ?a;
??fn3()?
?fn2()
console.log(a); ? ? ?//6
function ? fn2() {
console.log(a) ? ? // 6a =20
}
}
function ? fn3() {
console.log(a) ? ?//1
a =200
}
fn()
console.log(a) ? ? ? ? ? ? //20
`
作用域鏈:
globalContext ={
AO { a:20,
fn:function() { }长窄,
fn3:function( ) { }
}
}
fn.[[scope]]=globalContext.AO
fn3.[[scope]]=globaContext .AO
fnConntext = {
AO {a:6,
fn2:function( ) { },
}
fn.[[scope]]=globalContext.AO
}
fn2.[[scope]]=fnContext.AO
fn3Context ={
AO { },
fn3.[[scope]] = globalContext.AO
}
fn2Context = {
AO { }
fn2.[[scope]]=fnContext.AO
}