涵式是否需要名稱(具名涵式&匿名涵式)在於,有無調用需求

立即函式

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);

傳入參數若是物件,依然會維持傳參考特性,建議不調整原有參數的屬性,以免原本物件被調整