平时我们在<script>中写代码是这样的:
//声明一个方法f1
function f1(){
}
f1();//运行这个方法
或者
var f2 = function(){
}
f2();
这样在页面元素加载前就执行这个方法。
那么把上面的写法转换下:
(function(){})()
相当于我们声明了一个匿名方法,在声明后直接就调用了该方法。
通常(function(){})(param)我们这样写会出错,因为此时我们是调用方法阶段,并不是声明阶段,所以param必须是有意义的,不然就是没定义
对比:
通常和$(function(){})对比,这个是jquery提供的初始化方法,在页面渲染完成后才会执行,相当于是调用一个回调方法,那么在使用
(function(){})()的时候确实页面没有渲染就执行了,因此要特别注意不要在方法体里引用页面dom元素,不然是会出错的,所以经常在
编写自定义插件的时候使用,比较典型的就是jquery ui。
再来看些这样的写法:
(function($){
...
})(jQuery)
其实上面这段代码在没有引入jquery的时候是错误的,因为jQuery是没有哦声明的,而jQuery在jquery中声明了。
很奇怪的写法:
(function (window, document, undefined) {
//
})(window, document);
理解是和上面一样的,但是undefined时个什么情况,网上找了一个解释:
undefined参数
在ECMAScript 3中undefined是mutable的,这意味着可以给undefined赋值,而在ECMASCript 5的strict模式('use strict';)下是不可以的,解析式时会报语法错。
想了些,我们调用上面f1方法,写成f1(123),其实也是可以的,是不是一个道理