( function(){…} )()和( function (){…} () )是两种javascript立即执行函数的常见写法,要理解立即执行函数,需要先理解一些函数的基本概念。
函数声明:
function fnName () {…};使用function关键字声明一个函数,再指定一个函数名,叫函数声明。
函数表达式:
var fnName = function () {…};使用function关键字声明一个函数,但未给函数命名,最后将匿名函数赋予一个变量,叫函数表达式,这是最常见的函数表达式语法形式。
匿名函数:
function () {}; 使用function关键字声明一个函数,但未给函数命名,所以叫匿名函数,匿名函数属于函数表达式,匿名函数有很多作用,赋予一个变量则创建函数,赋予一个事件则成为事件处理程序或创建闭包等等。
函数声明和函数表达式不同之处在于:
一、Javascript引擎在解析javascript代码时会‘函数声明提升'(Function declaration Hoisting)当前执行环境(作用域)上的函数声明。
而函数表达式必须等到Javascirtp引擎执行到它所在行时,才会从上而下一行一行地解析函数表达式。
二、函数表达式后面可以加括号立即调用该函数,函数声明不可以,只能以fnName()形式调用。
在function前面加!、+、 -甚至是逗号等到都可以起到函数定义后立即执行的效果,而()、!、+、-、=等运算符,都将函数声明转换成函数表达式。
消除了javascript引擎识别函数表达式和函数声明的歧义,告诉javascript引擎这是一个函数表达式,不是函数声明,可以在后面加括号,并立即执行函数的代码。
扩展资料
作用:
javascript中没用私有作用域的概念,如果在多人开发的项目上,你在全局或局部作用域中声明了一些变量,可能会被其他人不小心用同名的变量给覆盖掉。
根据javascript函数作用域链的特性,可以使用这种技术可以模仿一个私有作用域,用匿名函数作为一个“容器”。
“容器”内部可以访问外部的变量,而外部环境不能访问“容器”内部的变量,所以( function(){…} )()内部定义的变量不会和外部的变量发生冲突,俗称“匿名包裹器”或“命名空间”。
JQuery使用的就是这种方法,将JQuery代码包裹在( function (window,undefined){…jquery代码…} (window)中,在全局作用域中调用JQuery代码时,可以达到保护JQuery内部变量的作用。
JS函数的定义方式比较灵活,它不同于其他的语言,每个函数都是作为一个对象被维护和运行的。
先看几种常用的定义方式:
function func1([参数]){
/函数体/
}
var func2=function([参数]){
/函数体/
};
var func3=function func4([参数]){
/函数体/
};
var func5=new Function();
上述第一种方式是最常用的方式,不用多说。
第二种是将一匿名函数赋给一个变量,调用方法:func2([函数]);
第三种是将func4赋给变量func3,调用方法:func3([函数]);或func4([函数]);
第四种是声明func5为一个对象。
再看看它们的区别:
function func(){
//函数体
}
//等价于
var func=function(){
//函数体
}
但同样是定义函数,在用法上有一定的区别。
<script>
//这样是正确的
func(1);
function func(a)
{
alert(a);
}
</script>
<script>
//这样是错误的,会提示func未定义,主要是在调用func之前没有定义
func(1);
var func = function(a)
{
alert(a);
}
//这样是正确的,在调用func之前有定义
var func = function(a)
{
alert(a);
}
func(1);
</script>
用同样的方法可以去理解第三种定义方式。
第四种定义方式也是需要声明对象后才可以引用。
我们从js的函数执行逆回去才能看清他的执行过程
如果有一个带一个参数的函数a(这里先不定义函数a,就是假设已经有了)
那么他执行就是
a(b);
这种样式
我们还知道,js的匿名函数很强大,
var c=function(paramC){};
那么c(paramCobj);就是执行了这个匿名函数
所以,就刚才的a(b);来说,a可以是匿名函数
a=function(paramA){};
a(b);
有可能就是这个结构
好了,jquery连第一步都省了,直接使用没有名称的匿名函数
那么a(b);这里的a,就被替换成了匿名函数,所以就成了
(function(paramA){})(b);(匿名函数在js中因为也是对象,所以需要双括号包裹起来)
这个结构就说明了,我使用了匿名函数,并且立刻执行这个匿名函数
再分析(function(paramA){})(b)这种格式,匿名函数部分参数paramA是个形参,用在匿名函数内部作为值的调用,而b这个参数就是个实参,是将b这个值代入到函数内部
我说的算是比较浅显易懂了
大部分时候,(function($) {})(jquery);所在的上下文环境中,肯本没有jquery这个参数,所以在jquery匿名函数内,他会自己创建jquery对象
你的信息已回复
我这里再简要说明下,
(function($) {})(jquery);
和
a=function($) {};
a(jquery);
等价
所以,这种写法就是为了让匿名函数立即执行
function a{}这是一个类而不是函数,function a(){};这才是一个函数,b也同样,如果调用b,就直接b();就会运行函数b,如果b是参数,b()这是传的b运行后返回的值,b是传的b这个函数
注释已经很清楚了 就是个构造用函数
其具体步骤
if(windowdocViewJs = undefined)
如果window全局没有(值为undefined或未定义)docViewJs这个变量
那麽就
windowdocViewJs=self(window,document)
赋值self的执行结果给docViewJs
self就是传给匿名函数function(self)的参数, 这个参数是个函数(所以可以调用)
这个函数function(window,document)
返回了其内部定义的docViewJs, 是个Object
所以最终结果就是使得页面上有docViewJs这个命名空间
你用了这段代码, 其函数全绑定到了windowdocViewJs,
当然你只能用docViewJsxxx开头了
最好别用匿名函数,重复触发会重复添加,你添加的匿名函数会重复执行
最好声明出来,然后不能有参数,因为addEventListener的第二个参数是函数名,不能是函数名()这样的形式,不然在添加的时候就会运行一次
用声明出来的函数,重复触发addEventListener也不会添加多个
刚刚踩坑,55555555
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)