Skip to content

Latest commit

 

History

History
90 lines (72 loc) · 1.82 KB

iife.md

File metadata and controls

90 lines (72 loc) · 1.82 KB

IIFE

Không dùng IIFE

var Global = {
	local: function () {
		var local = null
		return {
			getLocal: function () {
				return local
			},
			setLocal: function (params) {
				local = params
			}
		}
	}
}

// console.log( Global.local().getLocal())

Dùng IIFE

var Global= {
	local: (function () {
		var local = null
		return {
			getLocal: (function () {
				return local
			})(),
			setLocal: function (params) {
				local = params
			}
		}
	})()
}

// not work !!! 
// console.log( Global.local.getLocal) => null
//  Global.local.setLocal('123')
// console.log( Global.local.getLocal) => null

vấn đề là chổ getLocal và setLocal invoke 2 hàm khác nhau và do đó closure(var local) sẽ khác nhau

var Global= {
	local: (function () {
		var local = null
		return {
			getLocal: function () {
				return local
			},
			setLocal: function (params) {
				local = params
			}
		}
	})()
}

// bo IIFE chổ setLocal đi, cả 2 sẽ cùng chung 1 closure
// it work !
 Global.local.setLocal('namespace')
console.log( Global.local.getLocal());

Như trường hợp này khi in ra thì message dã undifine

một ví dụ khác ở đây. Mối hàm result() sẽ truy cập tới 1 closure khác nhau

var result = [];
for(var year = 0; year < 5; year++) {
    (function() {
        var y = year;
        result.push(function() { return y; });
    })();
}
console.log(result[1]()); // 1
console.log(result[3]()); // 3