函數(shù)只是一個(gè)可以執(zhí)行的值
比如袄琳,可以把函數(shù)賦值給變量和對(duì)象的屬性询件,也可以當(dāng)作參數(shù)傳入其他函數(shù),或者作為函數(shù)的結(jié)果返回
length屬性
返回定義函數(shù)時(shí)唆樊,參數(shù)的個(gè)數(shù)
function fn(a,b,c){}
fn.length //3
作用域
Javascript只有兩種作用域:一種是全局作用域宛琅,另一種是函數(shù)作用域
1.函數(shù)外部聲明的變量就是全局變量(global variable),變量可以在函數(shù)外部讀取逗旁,也可以在函數(shù)內(nèi)部讀取
2.在函數(shù)內(nèi)部聲明的變量嘿辟,變量只在函數(shù)內(nèi)部存在。外部無(wú)法讀取痢艺,稱(chēng)為“局部變量”(localvariable)仓洼。
3.函數(shù)內(nèi)部定義的變量介陶,會(huì)在該作用域內(nèi)覆蓋同名全局變量堤舒。
4.如果函數(shù)是在全局作用域聲明的,執(zhí)行時(shí)只取全局變量的值哺呜,不會(huì)取局部變量的值舌缤。如果是在局部作用域聲明的,執(zhí)行時(shí)優(yōu)先取聲明時(shí)局部作用域的值
參數(shù)
1.length屬性返回定義函數(shù)時(shí)某残,參數(shù)的個(gè)數(shù)
2.arguments對(duì)象包含了函數(shù)運(yùn)行時(shí)的所有參數(shù)国撵,該對(duì)象可以讀寫(xiě)參數(shù)值
3.函數(shù)參數(shù)如果是原始類(lèi)型的值(數(shù)值、字符串玻墅、布爾值)介牙,傳遞方式是傳值傳遞(passes by value)。這意味著澳厢,在函數(shù)體內(nèi)修改參數(shù)值环础,不會(huì)影響到函數(shù)外部囚似。
4.但是,如果函數(shù)參數(shù)是復(fù)合類(lèi)型的值(數(shù)組线得、對(duì)象饶唤、其他函數(shù)),傳遞方式是傳址傳遞(pass by reference)贯钩。也就是說(shuō)募狂,傳入函數(shù)的原始值的地址,因此在函數(shù)內(nèi)部修改參數(shù)角雷,將會(huì)影響到原始值祸穷。
var p = 2;
function f(p) {
p = 3;
}
f(p);
console.log(p) // 2
以上可以這么看:
// 相當(dāng)于函數(shù)內(nèi)部執(zhí)行:
var p= arguments[0]//2,
p=3
所以函數(shù)內(nèi)部的p改變,不會(huì)影響函數(shù)外部的p
閉包
閉包的用處
1.可以讀取函數(shù)內(nèi)部的變量
2.讓這些變量始終保持在內(nèi)存中勺三,即閉包可以使得它誕生環(huán)境一直存在粱哼。
3.封裝對(duì)象的私有屬性和私有方法
4.閉包就是將函數(shù)內(nèi)部和函數(shù)外部連接起來(lái)的一座橋梁。
function Person(name) {
var _age;
function setAge(n) {
_age = n;
}
function getAge() {
return _age;
}
return {
name: name,
getAge: getAge,
setAge: setAge
};
}
var p1 = Person('張三');
p1.setAge(25);
p1.getAge() // 25
立即執(zhí)行函數(shù)
(function(a){
console.log(a)
}(100));
// 100
可以看作同下面一樣:
function fn(a){
console.log(a)
} //先聲明
fn(100) //再調(diào)用