js封闭空间与自执行函数

封闭空间主要用来防止全局函数名污染空间

Posted by AllocatorXy on February 14, 2017

封闭空间和自执行函数

封闭空间用来防止全局函数名污染空间,该函数名仅在封闭空间内部有效;
封闭空间可以用来写自执行函数;

(function print() {
    console.log('msg1');
})();
(function print() { // 函数名相同
    alert('msg2');
})();
// console: msg1
// alert: msg2

自执行函数可以是匿名函数

(function () {
    console.log('msg');
})();
// console: msg

封闭空间内函数可以传参,在执行括号内写参数值(sth),在匿名函数声明时写参数;

(function (arg) {
    console.log(arg);
})('msg');
// console: msg

但要注意的是,封闭空间函数不能连续执行,只有第一次会被执行,
猜想: 第二个执行('msg2')不会识别封闭空间内的函数,而会把第一个执行('msg')误认为函数,
但第一个括号内并不是函数,而是一个参数,所以报错TypeError;

(function (arg) {
    alert(arg);
})('msg1')('msg2');
// alert: msg1
// console: Uncaught TypeError: (intermediate value)(...) is not a function

验证:如果将返回值设为一个函数,返回后第一个执行获得函数,可以连续执行;

(function (arg) {
    alert(arg);
    return function (arg) {
        alert(arg);
    };
})('msg1')('msg2');
// alert: msg1
// alert: msg2