(function(){...})()
(function(){...}())

这是两种js立即执行函数的常见写法。

基本概念:

函数声明:function fname(){...}; 使用function关键字声明一个函数,再指定一个函数名。

函数表达式:var fname=function(){...}; 使用function关键字声明一个函数,但未给函数命名,最后将匿名函数赋予给一个变量。

匿名函数:function(){}; 使用function关键字声明一个函数,但未给函数命名。(匿名函数也属于函数表达式。)

(匿名函数作用很多,赋予一个变量则创建函数,赋予一个事件则成为事件处理程序等。。)

关于函数声明和函数表达式的区别:

1:函数声明的Function declaration Hoisting(换成人话就是函数声明提升),函数表达式不具备这点,它需要被js代码解析到当前这行时才可以调用。

2:函数表达式后边加 ()立即调用该函数,函数声明不可以,它只能以fname()调用。

例子:

 fName();
function fName(){...}//正确,函数声明提升,所以 fName()可以写在函数声明之前。 fName();
var fName=function(){...}//错误,函数表达式不具备函数声明提升。 var fName=function(){...}();//正确,函数表达式后边加()立即调用函数。 function fName(){...}();//错误,函数声明必须用fName()调用。
//这行代码被解析为两部分: 1函数声明 function fName(){...}, 2分组表达式(),这表达式有误,因为括号内没有表达式, function (){...}();//匿名函数不可以这么调用,因为function(){...}被当做了声明,声明不可以直接()调用。

顺便说下立即调用IIFE(Immediately Invoked Function Expression):

(function(){...})() 和 (function(){...}()) 是没区别的!

传统的定义函数为:

 function foo(){...} //这是定义,Declaration,只是让解释器知道其存在,不会运行

 foo(); //这是语句,解释器遇到语句会运行它

为什么要IIFE呢? 1:传统的方法啰嗦。 2:传统的方法污染全局命名空间

于是 我们这么写  function foo(){...}();  这样写行么。。不行,为啥,因为function foo(){...}这部分只是声明,对解释器来说,像是你写了串字符串“function foo(){...}”,它需要的是解析函数,可以用比如eval()来执行它才可以。所以把()直接放声明后边是不行的,错误语法!

然而,我们距离成功相当接近,只需要把函数声明变成函数表达式就可以了。方法非常多,最常见的方法是用一对() 包裹起来。 (function foo(){...})();

这就等价于

 var foo= function(){...};
foo();

当然 还有很多别的方法可以把声明变成表达式:

  !function foo(){...}();
+function foo(){...}();
void function() {...}();

需要全局对象的时候,可以这么传, 举例:

 void function(global){
console.log("a's value is: "+global.aa); //可以获取全局对象中aa的值
}(this)
 var aa=10;
(function(a){
console.log("hello world"+a);
})(aa);

最新文章

  1. html5中新增的form表单属性
  2. [UML]UML系列——时序图(顺序图)sequence diagram
  3. Python下RSA加密/解密, 签名/验证
  4. 歌词文件解析(一):LRC格式文件的解析
  5. MVC Autofac构造函数注入
  6. 在Web.config或App.config中的添加自定义配置
  7. sqlite 的比较等运算是根据不同的值而不同的,并不是根据的字段类型,因为 sqlite 是弱类型字段
  8. [转]人人网首页拖拽上传详解(HTML5 Drag&Drop、FileReader API、formdata)
  9. Python 删除 数组
  10. hdoj 5194 DZY Loves Balls【规律&&gcd】
  11. android 中View, Window, Activity, WindowManager,ViewRoot几者之间的关系
  12. JavaScript利用闭包实现模块化
  13. ThinkPHP 前台视图实现类似于Yii的自动验证
  14. Class类与Java反射
  15. redis主从相关问题
  16. python3 发生器 迭代器 内置函数 协程 哈哈我又回来啦
  17. requests基本应用
  18. Thrift架构介绍
  19. Android 提高 gradle 的编译速度
  20. jmeter安装与环境变量配置

热门文章

  1. 基础知识---IEnumerable、ICollection、IList、IQueryable
  2. nginx 配置反向代理,负载均衡实战解析
  3. 七雄Q传封包辅助技术探讨回忆贴
  4. c# 项目nuget不自动安装dll
  5. 安全漏洞系列(一)---XSS漏洞解决方案(C# MVC)
  6. P3028 汽水机(差分)
  7. English--介词省略句型与总结
  8. 实验吧简单的sql注入3
  9. webpack打包js文件
  10. 配置WDA程序到NWBC