var mylib = (function (global) {
function log(msg) {
console.log(msg);
}
log1 = log;  // 法一:利用没有var的变量声明的默认行为,在log1成为全局变量(不推荐)
global.log2 = log;  // 法二:直接在全局对象上添加log2属性,赋值为log函数(推荐)
return {  // 法三:通过匿名函数返回值得到一系列接口函数集合对象,赋值给全局变量mylib(推荐)
log: log
};
}(window));function selfUpdate(){
window.selfUpdate = function(){
alert('second run!');
};
alert('first run!');
}
selfUpdate(); // first run!
selfUpdate(); // second run!log1 = log;这个log1既然是全局变量,为什么在函数外无法调用log: log这个是什么玩意
selfUpdate(); 为什么两次不同

解决方案 »

  1.   

    var q = (function()
    {
    p = 1
    })();
    alert(p);
    p可以用啊。function selfUpdate(){
        window.selfUpdate = function(){
            alert('second run!');
        };
        alert('first run!');
    }
    window.selfUpdate(); // first run!
    window.selfUpdate(); // second run!
    其实两次都是调的window.selfUpdate,只不过第一次调用之后把新的地址函数地址赋值给了selfUpdate,就好比window.selfUpdate=function(){
        window.selfUpdate = function(){
            alert('second run!');
        };
        alert('first run!');
    }
      

  2.   

    window.selfUpdate窗口函数调用一次后自动更新把log: log赋值给mylib
      

  3.   

    1.全局变量log1可以调用。
    2.{log:log}是匿名函数(function(global){...})执行后返回的一个对象,该对象含有一个名叫log的属性且属性值为匿名函数内的log函数(function log(msg){...}),这里只不过是属性名称和函数名称刚好相同而已。最终,返回的这个对象被赋给变量mylib。
    3.selfUpdate函数第一次执行时发生了两个个操作,一个是重新定义selfUpdate函数为弹出"second run",另一个是弹出"first run"。selfUpdate第二次执行的时候,此时它(因为第一次执行时的重定义)已经变成(可以理解为:function selfUpdate(){alert('second run')})新的函数,所以弹出"second run"。