js 立即调用函数 IIFE(Immediately Invoked Function Expression) 【转】
原文链接:https://www.cnblogs.com/ming-os9/p/8891300.html
JS中 (function(){...})()立即执行函数
1 (function(){...})()
3 (function(){...}())
这是两种js立即执行函数的常见写法。
基本概念:
函数声明:function fname(){...}; 使用function关键字声明一个函数,再指定一个函数名。
函数表达式:var fname=function(){...}; 使用function关键字声明一个函数,但未给函数命名,最后将匿名函数赋予给一个变量。
匿名函数:function(){}; 使用function关键字声明一个函数,但未给函数命名。(匿名函数也属于函数表达式。)
(匿名函数作用很多,赋予一个变量则创建函数,赋予一个事件则成为事件处理程序等。。)
关于函数声明和函数表达式的区别:
1:函数声明的Function declaration Hoisting(换成人话就是函数声明提升),函数表达式不具备这点,它需要被js代码解析到当前这行时才可以调用。
2:函数表达式后边加 ()立即调用该函数,函数声明不可以,它只能以fname()调用。
例子:

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

顺便说下立即调用IIFE(Immediately Invoked Function Expression):
(function(){...})() 和 (function(){...}()) 是没区别的!
传统的定义函数为:
1 function foo(){...} //这是定义,Declaration,只是让解释器知道其存在,不会运行
2
3 foo(); //这是语句,解释器遇到语句会运行它
为什么要IIFE呢? 1:传统的方法啰嗦。 2:传统的方法污染全局命名空间
于是 我们这么写 function foo(){...}(); 这样写行么。。不行,为啥,因为function foo(){...}这部分只是声明,对解释器来说,像是你写了串字符串“function foo(){...}”,它需要的是解析函数,可以用比如eval()来执行它才可以。所以把()直接放声明后边是不行的,错误语法!
然而,我们距离成功相当接近,只需要把函数声明变成函数表达式就可以了。方法非常多,最常见的方法是用一对() 包裹起来。 (function foo(){...})();
这就等价于
1 var foo= function(){...};
2  foo();
当然 还有很多别的方法可以把声明变成表达式:
1  !function foo(){...}();
2 +function foo(){...}();
3 void function() {...}();
需要全局对象的时候,可以这么传, 举例:
1 void function(global){
2     console.log("a's value is: "+global.aa);  //可以获取全局对象中aa的值
3 }(this)
1 var aa=10;
2 (function(a){
3 console.log("hello world"+a);
4 })(aa);
js 立即调用函数 IIFE(Immediately Invoked Function Expression) 【转】的更多相关文章
- js的调用函数前先执行某语句问题
		js的调用函数前先执行某语句问题 标签: web前端面试 2015-09-29 17:48 1455人阅读 评论(0) 收藏 举报 分类: js(5) 版权声明:本文为博主原创文章,未经博主允许不 ... 
- JS---------IIFE(Imdiately Invoked Function Expression 立即执行的函数表达式)
		+function($){}(jQuery); 今天看到js代码里面有这个格式的代码,不知道啥意思,就去查了一下,我也是js小白.首先前面的+号,这个不是固定非要写+号,只要写一级运算符都可以.目的是 ... 
- js的replace函数入参为function时的疑问
		近期在写js导出excel文件时运用到replace方法,此处详细的记录下它各个参数所代表的的意义. 定义和用法 replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式 ... 
- js里调用函数时,函数名带括号与不带括号的区别
		function test(){ return 1;}var a=test;console.log(a);//输出[Function: test]var b=test();console.log(b) ... 
- js 立即调用函数
		function makeCounter() { //不能立即执行 // 只能在makeCounter内部访问i var i = 0; return function () { console.log ... 
- jquery跨js文件调用函数示例
		var common_func; (function() { common_func = { load_hot_data: function(AreaCode) { var hot_html = &q ... 
- jacascript 立即执行函数(IIFE)与闭包
		前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 一直没搞清楚立即执行函数和闭包之间的关系,总结一下: 闭包有很多种理解:访问不到内部作用域,函数就是这样, ... 
- Js基础知识4-函数的三种创建、四种调用(及关于new function()的解释)
		在js中,函数本身属于对象的一种,因此可以定义.赋值,作为对象的属性或者成为其他函数的参数.函数名只是函数这个对象类的引用. 函数定义 // 函数的三种创建方法(定义方式) function one( ... 
- Javascript 自动执行函数(立即调用函数)
		开头:各种原因总结一下javascript中的自动执行函数(立即调用函数)的一些方法,正文如下 在Javascript中,任何function在执行的时候都会创建一个执行上下文,因为function声 ... 
随机推荐
- python threading ThreadPoolExecutor源码解析
			future: 未来对象,或task的返回容器 1. 当submit后: def submit(self, fn, *args, **kwargs): with self._shutdown_lock ... 
- Anchor 和 Dock 属性的使用
			Anchor 是一个常用属性,用来控制当窗体大小变化,控件如何自动调整自身大小和位置 一 仅设置一个值 如果此时将窗体放大,将会变成这样: 由于固定了top, 所以top不变,那么bottom自然会因 ... 
- Spring Boot 使用 Log4j2 & Logback 输出日志到 EKL
			文章目录 1.ELK 介绍 2.环境.软件准备 3.ELK 环境搭建 4.Spring Boot 配置示例 4.1.Log4j2 方式配置 4.2.Logback 方式配置 1.ELK 介绍 ELK ... 
- 基于Proxy的小程序状态管理
			摘要: 小程序状态管理. 作者:wwayne 原文:基于Proxy的小程序状态管理 Fundebug经授权转载,版权归原作者所有. 微信小程序的市场在进一步的扩大,而背后的技术社区仍在摸索着最好的实践 ... 
- ios问题笔记
			32位 最多内存0到3G 64位 最多内存0到8G iOS模板code4app.com github.com developer.apple.con 动画 label不能变小 只能变大,(而uivie ... 
- Google Analytics 学习笔记二 —— GA部署
			一.直接部署 直接复制GA跟踪代码 放到所有页面 跟踪代码放到 "head"前面 二.GTM部署方法一 三.GTM部署方法二 Tacking ID 四.测试.参数配置与调优 
- InnoDB Multi-Versioning
			InnoDB 是一个数据多版本的存储引擎,它会保持它修改的数据的旧版本数据以此来支持事务特性,比如并发操作和事务的回滚.这些旧版本数据存储在一个叫做rollback segment的数据结构中(回滚段 ... 
- mycat原理及分表分库入门
			1.什么是MyCat: MyCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原 ... 
- 【Mysql】初识MySQL
			一. MySQL是客户端/服务器架构1)macOS操作系统上的默认安装目录:/usr/local/mysql/ 在MySQL的安装目录下有一个bin目录,这个目录下存放着许多可执行文件.2)将该bi ... 
- Swagger从入门到放弃
			如何编写基于OpenAPI规范的API文档 简介 Swagger Swagger是一个简单但功能强大的API表达工具.支持的语言种类繁多 使用Swagger生成API,我们可以得到交互式文档,自动生成 ... 
