函数表达式()()和函数声明function的区别

()()表示立即执行一个函数表达式,拆分来看第一个括号里的是一个函数声明,第二个括号表示立即执行这个表达式,下面我们来理解一下什么是函数表达式和函数声明。

区分函数表达式和函数声明的区别在于function的位置,如果function不是出现在一段函数的第一个词,那么这是一个函数表达式,若function是第一个词,则是一个函数声明。函数声明和函数表达式的区别有哪些呢?我们来看下面这一段代码:

var a = 2;
function test() {
    var a = 3;
    console.log(a);//3
}
test();
console.log(a); //2

这段代码声明了一个一个test函数,在下面用test()调用了它,并且在函数内声明的a变量也没有污染全局变量,但是这里还是有两个问题,首先我们必须声明一个test函数,这个test名称本身就污染了全局变量,然后我们还需要显式的调用test。我想,如果函数不需要函数名(至少函数名不去污染全局作用域),并且能够自动执行,这样会更加理想。

js中提供了能同时解决这两个问题的方法,那就是使用函数表达式()(),前面的()用来包裹函数,后面的()用来执行函数,我们来看示例代码:

var a = 2;
(function test(){
	var a = 3;
	console.log(a); //3
})()
console.log(a); //2

函数声明和函数表达式最重要的区别就是它们的名称标识符会被绑定在何处。我们比较一下这两个代码片段,前一段代码将函数的名称标识符test绑定在所在的函数作用域中,而第二段代码中test绑定在函数表达式自身的函数中而不是全局作用域中。也就是说(function test(){...})()意味着test只能在...这个位置被访问到,在外部任何位置都访问不到。test变量名被隐藏在了自身中而不去污染全局作用域,这一种非常理想的方法,其实我们常用的框架也是基于这种方法去实现,比如JQuery。

猜你喜欢

转载自blog.csdn.net/caishi13202/article/details/82700481