涵式是否需要名稱(具名涵式&匿名涵式)在於,有無調用需求
1.立刻執行
2.無法在涵式外被呼叫
(function(){
console.log('立即涵式');
})(); //立即涵式
//---------
(function(){
var man = '小明'; //限制變數作用域
console.log(man); //小明
})();
console.log(man); //is not defined
//----------
可透過後面括號將參數傳入立即涵式
(function(where){
console.log(where); //小明在這
})('小明在這');
立即涵式屬於表達式,可以宣告變數
var whereMan = (function(where){
console.log(where); //小明在這
return where;
})('小明在這');
console.log(whereMan); //小明在這
用物件傳參考特性,帶入立即涵式
var a = {
a1:'1',
b1:'2',
c1:'3',
};
(function(b){
console.log(b); //a{.....}
})(a);
(function(c){
console.log(c); //a{.....}
})(a);
將window全域物件傳入第一個立即涵式,並在全域中掛上一個屬性man='小明',再用第二個立即涵式叫用。(運用在大型框架vue.....)這種方式可以確保框架能正確掛載到全域變數上。
(function(b){
b.man = '小明';
})(window);
(function(c){
console.log(man);
})();
function callName(a){
var a; //變數本身已經存在的話,宣告會沒有作用
console.log(a); //小明
a = '杰倫';
console.log(a); //杰倫
}
callName('小明');
參數在傳入時就已經定義好了,不會受hoisting(提升)影響,
function callName(a){
console.log(a); //ƒ a(){}
function a(){}
var a;
console.log(a); //ƒ a(){}
a = '杰倫';
console.log(a); //杰倫
}
callName('小明');
參數名稱可自行定義,參數名稱跟傳入值沒有關連性,只重視接收幾個值,順序,不會受到外層影響,數量不足時會以undefined呈現。
function call(d,c,b,a){
console.log(d,c,b,a) //a b c undefined
}
var a = 'a';
var b = 'b';
var c = 'c';
call(a,b,c);
傳入參數若是物件,依然會維持傳參考特性,建議不調整原有參數的屬性,以免原本物件被調整