`
gdpglc
  • 浏览: 92863 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

之前没看懂的js代码,今天看懂了

阅读更多
寓尔看过几眼jQuery插件的代码,发现这样的代码很是希奇:
(function($){

   js code...

})(jQuery);

从未深究,今天突然想明白了。

实际上,上边的代码就是一个js函数调用。

以下这部份

(function($){

   js code...

})

相当于是函数;

(jQuery) 则是函数调用时的参数列表。

以上代码等价于如下代码:

function test($){

   js code...

}

test(jQuery);


新手的盛宴!
分享到:
评论
39 楼 tonly85 2011-06-24  
一个匿名函数,lambda表达式啊
38 楼 gdpglc 2011-06-22  
呵呵 新手的盛宴!
37 楼 lythemaster 2011-06-22  
不错,学习了,“匿名函数立刻执行”~
36 楼 shenliu 2011-06-22  
恭喜楼主,进步就是这样,在每一个细小的地方~~ 我也在某个问题上突然顿悟过,感觉很好!
35 楼 sebatinsky 2011-06-21  
呵呵,自己真是菜到不行,工作几年,其实比那些在校的很多地方都不如。。
34 楼 gdpglc 2011-06-21  
沙舟狼客 写道
(函数名)(参数),这样理解对吗?


从代码上看是 (函数定义)(参数)

函数定义,应该是作为js对象存在的。

测试如下 :
<script>
	var test=function a1(){alert('a1')}
	test();
	
	function a2(){alert('a2')}
	var b=a2;
	b();
</script>
33 楼 沙舟狼客 2011-06-21  
(函数名)(参数),这样理解对吗?
32 楼 int08h 2011-06-21  
BuN_Ny 写道
JavaStudyEye 写道
请问

如下代码的含义是啥啊?为啥要加undefined呢?

(function($, undefined){
   js code...
})(jQuery);



比较蛋疼的问题。你看很多js库都有window.undefined = window.undefined; 为啥?
早期版本的某些浏览器没有全局变量undefined,所以,右边的 window.undefined就会返回undefined,然后把它赋值给window.undefined。其实和window.undefined = window.a,或者window.b没什么分别。

然后说jQuery,它通过不传入第二个参数来定义undefined而已。也就是
有人说的:
function fn(a){
  alert(a);
}
fn();
把a改成undefined就行了。

比较巧妙的是,jQuery是在它的整个函数作用域内声明undefined,而非在全局作用域。它对全局变量的污染只有两个:$和jQuery.

不算太蛋疼,因为undefined是window下的一个变量,注意undefined和null不同,后者是关键字,前者只是个变量,这意味着寻找undefined需要2个过程:
1、延作用域链一直到Global环境,即window
2、在window这个Hash Object下找一个叫undefined的对象
关于第一点,看你的函数嵌套作用域有几层,作用域链的查找是有性能损失的
关于第二点,众所周知window大概是正常的环境下最大的一个对象了,各种第三方的脚本都往里面扔东西,比如Javaeye的这个回贴页面,我看了一下在Chrome下有481个对象挂在window下,且window是个宿主对象,并非原生的javascript对象,其访问有额外的性能损失

综上,把undefined通过参数的形式加入函数的VariableObject中,可以一定程度上加快对undefined的访问速度,如果经常用到的话(比如jquery处理重载),还是很适合的

PS:经我测试,部分浏览器似乎对undefined有特殊处理,不受window下对象的数量和作用域链的长度影响……
31 楼 haiyupeter 2011-06-21  
建议你看看这个:http://hzjavaeyer.group.iteye.com/group/wiki/2295-JavaScript-Core
30 楼 BuN_Ny 2011-06-21  
JavaStudyEye 写道
请问

如下代码的含义是啥啊?为啥要加undefined呢?

(function($, undefined){
   js code...
})(jQuery);



比较蛋疼的问题。你看很多js库都有window.undefined = window.undefined; 为啥?
早期版本的某些浏览器没有全局变量undefined,所以,右边的 window.undefined就会返回undefined,然后把它赋值给window.undefined。其实和window.undefined = window.a,或者window.b没什么分别。

然后说jQuery,它通过不传入第二个参数来定义undefined而已。也就是
有人说的:
function fn(a){
  alert(a);
}
fn();
把a改成undefined就行了。

比较巧妙的是,jQuery是在它的整个函数作用域内声明undefined,而非在全局作用域。它对全局变量的污染只有两个:$和jQuery.
29 楼 JavaStudyEye 2011-06-20  
rainsilence 写道
JavaStudyEye 写道
请问

如下代码的含义是啥啊?为啥要加undefined呢?

(function($, undefined){
   js code...
})(jQuery);


你看调用的时候只有一个参数对挖,第二个参数等于轮空了。这个参数就是未定义。但是老式的浏览器不存在undefined这个常量或者var undefined在函数前被定义了,造成了代码污染。所以放在这里等于用浏览器的特性来定义了一个常量。

function test(a) {
    alert(a);
}

test();

看看这个打印出来什么?

结果是 undefined 嘿嘿,谢了啊
28 楼 jackra 2011-06-20  
参数隔断。防止污染。
27 楼 gtssgtss 2011-06-20  
因为javascript没有块作用域,只有函数作用域。。。
26 楼 yangguo 2011-06-20  
看懂了有什么用。关键是要搞懂为什么要这么蛋疼地定义。
25 楼 hyj1254 2011-06-20  
准确地说()是个函数调用运算符..
24 楼 BetaRabbit 2011-06-20  
guilipan 写道
不就是一个闭包么..看下js基础就懂了

这个是“匿名函数立即执行”,和闭包毫无关系吧,虽然闭包中经常用这种执行方法……
23 楼 guilipan 2011-06-20  
不就是一个闭包么..看下js基础就懂了
22 楼 donghustone 2011-06-19  
原来这样,事实上这是js的一种方法调用方式,并不是jquery特有的。
21 楼 leafcold 2011-06-19  
窗户纸后面的东西很简单,但是捅破这层窗户纸还是需要一点特殊的东西,非常感谢lz的分析精神,受教啦
20 楼 jiangsha 2011-06-19  
总算明白了

相关推荐

Global site tag (gtag.js) - Google Analytics