zoukankan      html  css  js  c++  java
  • javascript自执行函数为什么要把windows作为参数传进去

    http://segmentfault.com/q/1010000000311686

    (function (window, $, undefined) {
        play=function(){
            $("#demo").val("This is a demo.");
        }
    
    
        window.wbLogin = play;
    })(window, jQuery);

    像上边这样的代码为什么要把window, jQuery对象传进去.

    为什么要传入 jQuery

    通过定义一个匿名函数,创建了一个“私有”的命名空间,该命名空间的变量和方法,不会破坏全局的命名空间。这点非常有用也是一个 JS 框架必须支持的功能,jQuery 被应用在成千上万的 JavaScript 程序中,必须确保 jQuery 创建的变量不能和导入他的程序所使用的变量发生冲突。

    为什么要传入 window

    通过传入 window 变量,使得 window 由全局变量变为局部变量,当在 jQuery 代码块中访问 window 时,不需要将作用域链回退到顶层作用域,这样可以更快的访问 window;这还不是关键所在,更重要的是,将 window 作为参数传入,可以在压缩代码时进行优化,看看 jquery-1.6.1.min.js:

    (function(a,b){})(window); // window 被优化为 a 
    

    为什么要传入 undefined

    自调用匿名函数的作用域内,确保 undefined 是真的未定义。因为 undefined 能够被重写,赋予新的值。

    undefined = "now it's defined";
    alert( undefined );
    

    浏览器测试结果:

    (感谢 @依云 的建议,添加浏览器版本号)

    浏览器     测试结果            结论
    ie8       now it's defined   可以改变
    firefox22 undefined          不能改变
    chrome31  undefined          不能改变
    opera12   undefined          不能改变



    一句话,使全局变量以参数形式变成自执行函数内部的局部变量。

    至于为什么这么做,提高程序效率。为什么能提高效率,得从javascript的机制说起,所谓的scope chain作用域链,在当前作用域中如果没有该属性(局部变量)则向上一层作用域中寻找,一直到最上层,也就是window。也就是说全局变量和下级作用域都是window的一个属性,向下依此类推。

    另外jQuery传入后将参数写成$可以保证在此函数内$为jquery而不是其他类似使用$符号的库。

    undefined同理,由于没有传入第三个参数,自然就是undefined。由于javascript中undefined是一个变量,可以被改变,所以这样可以保证undefined判断时的准确性。有时判断时使用typeof xxx === 'undefined'也是因为这个原因

     
  • 相关阅读:
    mybaits 时间查询DATE_FORMAT
    spring AOP
    Sqlserver 分页
    @PathVariable注解使用
    easyui 无限级数tree[menulist1 = GetMenuList(sm2,menulist1);]
    查询重复数据group by menu_id having count(menu_id)>1
    SQL把a表字段数据存到b表字段 update,,insert
    毕向东讲解(摘)—12.线程通信,解决安全问题
    URL的加密解密方法
    web项目中的浏览器行为和服务器行为
  • 原文地址:https://www.cnblogs.com/darr/p/4810296.html
Copyright © 2011-2022 走看看