今天遇到一个 !与function 的问题

!function($){   }  

! 是什么意思

$  在这里代表什么

!function($){ }  这是同一个自执行函数,了解前先了解下函数的基本概念;

函数声明:function box(){}

函数表达式:var box = function(){};

匿名函数:function(){} 属于函数表达式

    匿名函数的作用:如果将匿名函数赋值给一个变量,则声明了一个函数: var box= function(){};

            如果将匿名函数赋予一个事件则成为事件处理程序: box.addEventListener("click",function(){alert("aaa")});

            创建闭包:(function(){})()

 

自执行函数:执行函数的作用主要为 匿名 和 自动执行,代码在被解释时就已经在运行了。

自执行函数其他写法:

  1. (function () { /* code */ } ());

  2. !function () { /* code */ } ();

  3. ~function () { /* code */ } ();

  4. -function () { /* code */ } ();

  5. +function () { /* code */ } ();

自执行函数有什么用呢?

javascript中没用私有作用域的概念,如果在多人开发的项目上,你在全局或局部作用域中声明了一些变量,可能会被其他人不小心用同名的变量给覆盖掉,

根据javascript函数作用域链的特性,可以使用这种技术可以模仿一个私有作用域,用匿名函数作为一个“容器”,

“容器”内部可以访问外部的变量,而外部环境不能访问“容器”内部的变量,

所以( function(){…} )()内部定义的变量不会和外部的变量发生冲突,俗称“匿名包裹器”或“命名空间”。

function与感叹号

调用匿名函数的方式

(function(){alert('iifksp')})()        // true

或者:

(function(){alert('iifksp')}())        // true

虽然上述两者括号的位置不同,不过效果完全一样。

那么,是什么好处使得为数不少的人对这种叹号的方式情有独钟?如果只是为了节约一个字符未免太没有必要了,这样算来即使一个100K的库恐怕也节省不了多少空间。既然不是空间,那么就是说也许还有时间上的考量,事实很难说清,文章的最后有提到性能。

回到核心问题,为什么能这么做?甚至更为核心的问题是,为什么必须这么做?

其实无论是括号,还是感叹号,让整个语句合法做的事情只有一件,就是让一个函数声明语句变成了一个表达式。

 

function a(){alert('iifksp')}        // undefined  

这是一个函数声明,如果在这么一个声明后直接加上括号调用,解析器自然不会理解而报错:

function a(){alert('iifksp')}()        // SyntaxError: unexpected_token  

因为这样的代码混淆了函数声明和函数调用,以这种方式声明的函数 a,就应该以 a(); 的方式调用。

但是括号则不同,它将一个函数声明转化成了一个表达式,解析器不再以函数声明的方式处理函数a,而是作为一个函数表达式处理,也因此只有在程序执行到函数a时它才能被访问。

所以,任何消除函数声明和函数表达式间歧义的方法,都可以被解析器正确识别。比如:

  1. var i = function(){return 10}(); // undefined

  2. 1 && function(){return true}(); // true

  3. 1, function(){alert('iifksp')}(); // undefined

赋值,逻辑,甚至是逗号,各种操作符都可以告诉解析器,这个不是函数声明,它是个函数表达式。并且,对函数一元运算可以算的上是消除歧义最快的方式,感叹号只是其中之一,如果不在乎返回值,这些一元运算都是有效的:

  1. !function(){alert('iifksp')}() // true

  2. +function(){alert('iifksp')}() // NaN

  3. -function(){alert('iifksp')}() // NaN

  4. ~function(){alert('iifksp')}() // -1

甚至下面这些关键字,都能很好的工作:

  1. void function(){alert('iifksp')}() // undefined

  2. new function(){alert('iifksp')}() // Object

  3. delete function(){alert('iifksp')}() // true

最后,括号做的事情也是一样的,消除歧义才是它真正的工作,而不是把函数作为一个整体,所以无论括号括在声明上还是把整个函数都括在里面,都是合法的:

  1. (function(){alert('iifksp')})() // undefined

  2. (function(){alert('iifksp')}()) // undefined

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值