js:匿名函数/闭包前奏

js里面”万物皆对象“,函数同理

三种定义方式

a.传统的如同C语言一样的定义方式:function abc(){code}

b.少见的定义方式:var abc = new Function(‘参数‘,‘代码‘);  //由此可见我们的function是构造函数Function的对象实例,即函数也是对象

c.匿名函数定义:var abc = function(){...} //写一个匿名函数,并让一个变量称为它的引用

对于匿名函数有很多奇技淫巧:

1.若是我们平时用a,b方法定义函数,实际调用的时候需在函数名后+()并写入参数,如abc(),abc(a)..这基础、浅显但是重要

2.直接用匿名函数不赋值,(function(...){....})(实参);

3.也就是你平常写个匿名函数function(){}它是不会执行的,它只相当于一个函数名

4.然后来了一堆乱七八糟的写法是和2等效的

~(function(){...})(); //返回-1

void function(){...}();  //返回undefined

+/- function(){...}(); //返回NaN

~function(){...}(); //返回-1

!function(){...}(); //返回true

(function(){...}()); //undefinded

你不知道哪些混蛋会突然这样写代码,尤其在闭包问题上,见识过总是好的

闭包前奏

有个例子被人举烂了

但是我们有大多碰到过这种情况,至少我碰到过

for(var i=1;i<=5;i++){

  setTimeout(function(){alert(i)},i*1000);

}

这样会输出5次"6"

然后很基本大家都知道

for(var i=1;i<=5;i++){

  setTimeout((function(){alert(i)})(i),i*1000);

}

就好了,

会依次输出各位数字

然后很多人说:“这就是闭包”

wtf?这真的是闭包?

按照上一篇关于reference value 和 primitive value的解释

和之前我们对匿名函数的认识

就足够解释这一现象了,不需要闭包知识

由于alert是延迟执行的,按照第一种写法,哪怕只有1000ms,i已经变成6了

按照第二种写法会得到我们预期的效果是因为

在这个匿名函数后面加了(),

相当于在往setTimeout里放fallback函数时,

就执行了一次匿名函数

i是primitive value

函数传参的形式把当时的i值复制了份传了进去

这和闭包并没有太大的关系

抛开学术用语,我个人目前浅表的理解是这样

“如果一个func 里面的 innerFunc 被作为返回值”

则称之为闭包

这样func里面的环境及变量会被一直保留在内存之中

关于闭包,作为前奏先叙述到这里

将会在正篇继续研究和讨论

时间: 2024-08-28 03:16:10

js:匿名函数/闭包前奏的相关文章

js匿名函数闭包

函数声明: function functionName(arg0,arg1){ //函数体 } 函数表达式: var functionName = function(arg0,arg1){ //函数体 } 函数声明和函数表达式之间的主要区别是前者会在代码执行前被加载到作用域中,而后者是在代码执行到那一行的时候才会有定义.另一个区别是函数声明会给函数指定一个名字,而函数表达式则创建一个匿名函数,然后将这个函数赋给一个变量 1 递归 递归函数是在一个函数通过名字调用自身的情况下构成的,例如: fun

JS匿名函数声明,调用;JS闭包详解(转载)

js匿名函数的代码如下:(function(){ // 这里忽略jQuery 所有实现 })(); 半年前初次接触jQuery 的时候,我也像其他人一样很兴奋地想看看源码是什么样的.然而,在看到源码的第一眼,我就迷糊了.为什么只有一个匿名函数又没看到运行(当然是运行了…… ),就能有jQuery 这么个函数库了?于是,我抱着疑问来到CSDN .结果相信现在很多人都很清楚了(因为在我之 后也不乏来者,呵呵~ ).当一个匿名函数被括起来,然后再在后面加一个括号,这个匿名函数就能立即运行起来!真神奇哦

速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数

[源码下载] 作者:webabcd 介绍速战速决 之 PHP 函数基础 函数参数 函数返回值 可变函数 匿名函数 闭包函数 回调函数 示例1.函数的相关知识点 1(基础)function/function1.php <?php /** * 函数的相关知识点 1(基础) */ // 可以在相关的 function 声明语句之前调用该函数 f1(); function f1() { echo "f1"; echo "<br />"; } // 这里调用

js匿名函数确实是个好东西

<body > <script type="text/javascript"> void function() { alert('弹出框'); }(); </script> </body> <body > <script type="text/javascript"> void function() { alert('弹出框'); }(); </script> </body&g

js匿名函数封装

js匿名函数封装 (function(root,factory){ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (root.Demo = factory()); })(this,function(){ funct

[沫沫金]JS匿名函数this调用变量报错

背景 今天使用Dcloud扫码功能,success成功方法设置data中的scanContext变量,报"undefined"! 思路 一.怀疑是扫码内容不是JSON对象,无法点属性报错.排除,使用JSON.parse转换成功后,依然报"undefined".二.怎么就"undefined"呢,百思不得其解.继续想办法 解决 突然,看到附件选择的方法,人家是设置的this.fileUrl成功的.比对下,什么区别.发现定义的匿名方法,写法不同.我的

js匿名函数及闭包(javaScript高级程序设计第3版)

一.匿名函数 //普通函数 function box() { //函数名是box return 'Lee'; } //匿名函数 function () { //匿名函数,会报错 return 'Lee'; } //通过表达式自我执行 (function box() { //封装成表达式 alert('Lee'); })(); //()表示执行函数,并且传参 //把匿名函数赋值给变量 var box = function () { //将匿名函数赋给变量 return 'Lee'; }; aler

js匿名函数与闭包作用

http://www.jb51.net/article/79238.htm 1 闭包允许内层函数引用父函数中的变量,但是该变量是最终值 当mouseover事件调用监听函数时,首先在匿名函数( function(){ alert(i); })内部查找是否定义了 i,结果是没有定义:因此它会向上查找,查找结果是已经定义了,并且i的值是4(循环后的i值):所以,最终每次弹出的都是4.

PHP匿名函数(闭包函数)详解_php技巧 - PHP

文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 在PHP中匿名函数(Anonymous functions),也叫闭包函数( closures ),允许临时创建一个没有指定名称的函数.经常用作回调函数(callback)的参数. 当然,也有其他应用的情况. 注:php闭包是PHP5.3版本之后才有的 什么是闭包?闭包是可以包含自由(未绑定到特定对象)变量的代码块:这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量).“闭包