是的。这里的变量也包括函数。函数也是一种变量。匿名写法可以避免变量全局污染。
比如腔芦。在别人写过的一段js代码中你想在里面加一些自己的代码。最好的做法就是用匿名函数包裹。举个例子来看为什么。
比如,已经存在一胡运段别人写的代码了,假设这段代码很长你不想看。
//别人的代码....
....很多
//这里他定义了一个叫foo的函数
function foo{
... 一些函数逻辑
}
好,现在你自己想在同一个页面里面加一些自己的代码。假如你不知道别人已经定义了foo函数,你又额外在自己的函数里面定义一次
function foo{
..
}
把这段代码加在了页面的最后。这样你的函数定义就覆盖了 原来别人i写的函数定义。
恰巧,裤圆梁在某个事件里面,就使用foo函数。这个时候,原来的逻辑就不能正确执行了。
假如你的定义写在匿名函数里面, 那么这个定义就对外部不可见的,不会覆盖原来的。这样就避免了变量污染。 实际的应用,你就去参考 流行js库的源代码。通常都是如下写法
(function(){
var ....
....
})()
这样就会避免变量污染了。
注意,在开始的第一个字符 使用 分号,这是因为避免出现代码压缩时产生意外的错误。因为js可以省写分号。假设有段代码是
....
return result
然后又在js合并压缩时 合并成一个文件
...
return reslut(function(){...})()
如果没有分号就会成这样
....
return reslut(function(){...})()
在代码进行压缩后result 变成了一个函数了,这明显是错误的。
因此在匿名函数的前面加个 分号 也是个良好的习惯
很简单的例子:public class NoneClass {
Peoples man = new Peoples(){public void eat(){System.out.println("吃饭")}}
}
interface Peoples{
public void eat()
}
这里的
new Peoples(){public void eat(){System.out.println("吃饭")}}
就创建了个匿名内部类
本来接口interface是不能高仔new的,但是紧跟new Peoples(){}后跟的大括号,表示这个接口有戚兄汪个实现类,其实new的是Peoples这个接口的实现类,尘前但是这个实现类是匿名内部类的形式。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)