自从了解js通过canvas压缩图片上传功能以后,小白对javascript的敬畏之心又提升了一大截,这两天在练习的时候发现自己平时熟悉的代码变得陌生起来,比如为什么定义函数时这两个方式都可以用。
带着这个疑问,小白找到了老朱。“朱哥,为啥在js里面要用两种定义函数的方式呢?”
老朱:“严格意义上来说上面那个不是定义一个函数,而是将一个变量指向了一个匿名函数,这里是引用的关系。你可以控制台输出一下两个函数名看看。”
小白执行了一下输出以后惊讶的说道:“果然不一样啊,一个有函数名,一个没有函数名。”
老朱:“在js中匿名函数用处非常大,这几天我们写的代码里面有很多的匿名函数,你可以找找。”
小白:“哇,随便翻了一下昨天的代码里面就有匿名函数啊。这段点击按钮上传图片的代码中就有两个。”
老朱:“匿名函数非常有个特点,匿名函数如果没有被引用,用完后会被销毁,也就是垃圾回收释放内存。如果被引用,而引用它的那个变量一直在内存中,它指向的匿名函数就会一直存在,不会被销毁。比如上面的代码中click里面的匿名函数没有被引用,用完后会被销毁,匿名函数中的success指向的匿名函数被引用,只有success被销毁时,这个匿名函数才会被回收。垃圾回收这块说起来会比较复杂,我们有时间详细聊聊。”
老朱顿了一下接着说道:“之前我们用到的匿名函数基本都用在了参数传递和引用上,在js中匿名函数还有一个非常重要的用法就是在页面加载以后执行一个匿名函数。”
“这个函数在页面加载后会立即执行,如果函数有参数,可以通过最后面的小括号进行传参。如果这个页面被其他页面加载调用,这里的匿名函数被加载以后就会立即执行,由于匿名函数中我们使用了var进行变量定义,因此匿名函数中的变量不会与主页面中的变量冲突,匿名函数执行结束以后内部的变量也会被销毁,不会占用内存。”
“另外如果你的页面中引入很多其他js文件,为了避免变量冲突,也需要在页面中使用上面的匿名函数来规避风险。”
想学H5的朋友可以关注老炉,您的关注是我持续更新《小白HTML5成长之路》的动力!