闭包与自执行函数 区别
函数调用
函数声明与调用
我们可以通过如下定义函数,使用fun()来调用
fun(); // 调用函数 函数定义可以在下面function fun() {console.log(3);}
也可以用var来定义,此时应先声明后使用
var fn = function() {console.log(4);}fn(); // 调用函数 必须先声明后使用
匿名函数
(function(x, y){ alert(x + y);
})(2, 3);
这里创建了一个匿名函数(在第一个括号内),第二个括号(2, 3)用于调用该匿名函数,并传入参数。括号是表达式,是表达式就有返回值,所以可以在后面加一对括号让它们执行.
错误1
function(){ /* code */ }(); // SyntaxError: Unexpected token (
在js解析时,当遇到function关键字时,会默认把它当做是一个函数声明,而不是函数表达式,函数声明需要一个函数名,而上面的代码中函数没有函数名。(以上代码,也正是在执行到第一个左括号(时报错,因为(前理论上是应该有个函数名的。)
错误2
function foo(){ /* code */ }(); // SyntaxError: Unexpected token )
相当于先声明了一个叫foo的函数,之后进行()内的表达式运算,但是()(分组操作符)内的表达式不能为空,所以报错。(以上代码,也就是执行到右括号时,发现表达式为空,所以报错)。
(function {// code})是表达式, function {// code}是函数声明
立即执行函数
(function(){ /* code */ })();
当js执行到(function {// code})();时, 由于(function {// code})是表达式, js会去对它求解得到返回值, 由于返回值是一 个函数, 故而遇到();时, 便会被执行。也可以表示为如下形式
var i = function(){ return 10; }();
闭包
变量的作用域分全局变量和局部变量,局部变量仅在函数内部使用
闭包的核心就是内部函数可以引用外部函数的参数和变量,通过返回函数来扩大函数的作用域,如下定义outFun函数,在里面定义了inFun函数,inFun可以调用outFun中定义的num变量,return inFun返回了内部函数体,
function outFun() {var num = 10;function inFun() {console.log(num); // 非常正常的写法}return inFun; // 返回的是 inFun函数体 核心}
使用时,通过var demo = outFun();
调用outFun函数返回inFun的函数体,相当于这句话 var demo = function inFun() {console.log(num); }
在通过demo();
调用,此时访问到了内部的num变量。
闭包可以让一个变量长期驻扎在内存中,避免全局变量的污染
var res = (function() {var count = 29;return function add() {count++;console.log(count);}})();res(); //30res(); //31
闭包传递参数
定义函数如下,定义obj变量时,传入参数,当obj()调用时,输出传入的参数。
function Fun(x) {return function() {console.log(x);}}var obj = Fun(4);// 相当于 obj = function() {console.log(4)}obj(); //执行 console.log(4)
定义函数如下,定义obj时传入初始x值,obj();执行时,y参数为空,输出NaN,obj(2);执行时,输出6
function Fun(x) {return function(y) {console.log(x+y);}}var obj = Fun(4);// 相当于 obj = function(y) {console.log(4+y)}obj(); //NaNobj(2); //6
事件传递参数
我们将onclick事件绑定到函数体,调用move函数
btn1.onclick = function() {move(5);}btn2.onclick = function() {move(-5);}function move(speed) {box.style.left = box.offsetLeft + speed + "px";}
通过闭包可以直接返回函数体并传递参数
function move(speed) {return function() {box.style.left = box.offsetLeft + speed + "px";}}btn1.onclick = move(5);btn2.onclick = move(-5);
匿名函数创建闭包
var oEvent = {};
(function(){ var addEvent = function(){ /*代码的实现*/ }; function removeEvent(){} oEvent.addEvent = addEvent; oEvent.removeEvent = removeEvent;
})();
闭包与自执行函数 区别相关推荐
- 对于javaScript闭包,立即执行函数的用法的一些理解
最近在刷freeCodeCamp上面的题目,发现了这么一道有趣的题目,加深了我对于js中闭包和立即执行表达式的一些理解,题目如下: 给一个正整数num,返回小于或等于num的斐波纳契奇数之和. 斐波纳 ...
- 前端工程师地基 深入理解闭包 作用域 立即执行函数
闭包 一.作用域初探 作用域定义:变量(变量作用于又称上下文)和函数生效(能被访问)的区域 互相嵌套的函数,里面可以访问外面的,外面不能访问里面 外面不访问里面演示: var a = 123; fun ...
- 闭包、立即执行函数、this
一.闭包 1.变量的作用域 变量的作用域分为全局变量和局部变量. (1)全局变量与局部变量 全局变量: 函数以外定义的变量是全局变量 函数内部可以直接读取全局变量 // 全局变量var n = 202 ...
- 立即执行函数解决闭包问题
立即执行函数解决闭包问题 立即执行函数的定义 定义 : 此类的函数没有声明,在一次执行过后释放(被销毁),适合做初始化工作,针对初始化功能的函数,只想让他执行一次的函数,立即执行函数也有参数,也有返回 ...
- JavaScript ES6立即执行函数
立即执行函数 看过jQuery源码的人应该知道,jQuery开篇用的就是立即执行函数.立即执行函数常用于第三方库,好处在于隔离作用域,任何一个第三方库都会存在大量的变量和函数,为了避免变量污染(命名冲 ...
- JavaScript基础之立即执行函数
在JavaScript中有时候看到一些很神奇的函数比如下面截图: 这种函数只要浏览器加载的时候会自动运行,而需要调用,前面在闭包的时候也说过这种函数,一般将其称之为:立即执行函数. 立即函数的特征: ...
- JavaScript 函数声明,函数表达式,匿名函数,立即执行函数之区别
函数声明:function fnName () {-};使用function关键字声明一个函数,再指定一个函数名,叫函数声明. 函数表达式 var fnName = function () {-};使 ...
- 【JavaScript基础笔记】模块化、立即执行函数应用、闭包应用
模块化:为了提高JS代码的长期可读性,易维护性,将JS代码根据其对应的功能块区分成不同的JS文件,并将其包裹在立即执行函数内,从而使其中的变量设定为局部变量,不会造成不同模块的变量污染. 立即执行函数 ...
- ES5-7 立即执行函数、闭包深入、逗号运算符
1. 立即执行函数 定义在全局的函数只有关闭浏览器或者退出程序才会释放 IIFE: Immediately-Invoked Function Expression 解决页面加载自动执行,执行完成后立即 ...
最新文章
- aryson ms sql_数据治理:SQL数据清洗十八般武艺
- mysql 服务器监控系列-黄杉 mysqldba
- Cluster coefficient的理解
- mongoose 验证
- Activiti 简易教程一 version5.10
- 三星系统和鸿蒙系统,又一设备直升鸿蒙系统,现有操作系统被抛弃,和三星的想法一样!...
- SQL中的条件语句case-when-then-else(就像C中的switch case语句)
- spark-submit的使用
- BZOJ 4155 Humble Captains
- html5垂直线怎么画,HTML5 Canvas画线技巧
- 在python中、如果异常并未被处理或捕捉_Python异常处理总结
- Java使用OpenOffice实现Office系列文件转Pdf
- 【昇润蓝牙】蓝牙4.0BLE模组(型号CC2541) 两个蓝牙之间互相通信的使用日志
- GreenSock (TweenMax) 极简入门指南
- 在不受支持的 Mac 上安装 macOS Ventura、Monterey、Big Sur (OpenCore Legacy Patcher)
- jclasslib 插件安装及使用
- 【python--爬虫】彼岸图网高清壁纸爬虫
- Predicting Semantic Map Representations from Images using Pyramid Occupancy Networks 翻译
- jena java_java – 使用Jena查询wikidata
- 【图像增强】基于Frangi滤波器实现血管图像增强附matlab代码
热门文章
- 操作系统 --多级反馈队列调度算法
- d2admin中使用mock模拟数据
- python:什么?你听MP3居然还要付费?看我一键......
- bbl/bibitem格式参考文献的获得
- 总结用Java写记事本的过程
- vue生命周期函数,页面加载事件
- Vue.js学习 第一次学习
- java.sql.SQLException: 关闭的语句
- WIN7系统“无线网络显示用于网络的保存在该计算机上的设置与网络的要求不匹配”解决办法
- 《淘宝首页性能优化实践》文章阅读