javascript 中 “ !function(){}() ” 是什么意思?

javascript 中 “ !function(){}() ” 是什么意思?,第1张

( 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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12176578.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存