作者ChowMein (杉斑加纹)
看板Ajax
标题Re: [问题] (...)()或(...)(window)是什麽意思?
时间Sun Jul 15 06:57:09 2012
※ 引述《mrbigmouth (拒绝崩溃的蒲公英)》之铭言:
: 至於在後方的括号里丢入window,
: 是为了增加读取的速度。
: 这里的相关关键字叫做Scope Chain。
: 当你使用一个变数时,若javascript在当前环境找不到该名称的变数,
: 就会继续往外找寻,一直找到最外层的全域物件上还找不到时,才会报错
: 而大家都知道,目前所有浏览器的全域物件都叫window。
: 所有你宣告的广域函式跟变数都会挂在window下,
: 如果你想在上面的self invoking function里使用任何广域变数,
: javascript就得多经过一次的「找不到的过程」才能找到。
: 但是只要你把window当成参数丢进你的self invoking function里面,
: window就会变成你自制scope里的区域变数,
: 於是就省下了一层查找的功夫。
: 虽然我也很怀疑到底等省下多少功夫啦
: 但多丢参数毕竟只是动几下手指的事而已。
: 而一些其他的变种
: (function (window, undefined){
: })(window)
: 在scope里宣告了undefined这个变数,
: 但是在自我执行时又不丢给他,
: 如此便能够完全确定你在使用undefined时代表的真的是undefined,
: (是的,undefined是可以改变值的)
: 而这种
: (function ($){
: })(jQuery)
: 跟传window进去的意义是一样的
: 会这样使用的人应该是认为他在这个scope里面使用到的广域变数只有jQuery一个,
: 所以只丢jQuery进去,省去了在scope里面再次宣告的功夫。
: 另外,jQuery的$缩写是有可能改变的,
: (通常在你同时使用其他以$为缩写的library时)
: 因此这种方法也兼顾了相容性。
我来整理一下传入参数的用意,
1. 提升速度
区域变数比较快一点点.....
2. 别名
通常是用短名, jQuery 变 $, 虽然window, undefined没简短,
但别忘了程式码压缩, 像jquery.min.js
3. 包装, 封装
相容旧浏览器, 怕值被改, 或沙盒效果, 可说是同一件事
在NaN和Infinity早就是时, undefined 在ie5.5才成为一个global variable,
所以要自己定义一个变数, 而它们又都不是保留字,
可以当成自订的变数名来用,即使是全域, 这等同赋值,
ecmascript5不允许改写, 而新的浏览器也开始支援,
以上是怕程式员自己赋值, 而沙盒则是怕运行环境有变, 名称被改,
像window 要改用unsafeWindow
另外, 像 (function ($){ })(jQuery); 这麽常见,几乎成为一个规范时,
它本身就有宣示这是一个以 jQuery 写的...的意义
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 112.104.126.122
1F:推 B9: "use strict" 也比较适合包起来,才不会影响到 legacy code 07/15 17:54