自执行函数笔记
了解自执行函数之前,首先得理清一下函数的基本概念
1.函数声明:function aa(){};
使用function关键字声明一个函数并指定函数名
2.函数表达式:var a= function(){};
使用function关键字声明一个函数并将其赋予一个变量
(
值得注意的是 var a= function b(){}这样的形式统一按照var a= function (){}处理,如果调用b(),会抛出异常!
)
3.匿名函数: function(){}
匿名函数有很多作用,赋予一个变量则创建函数,赋予一个事件则成为事件处理程序或创建闭包等等,它属于一种函数表达式
函数声明与函数表达式的区别如下:
1.Javascript引擎在解析js代码时,会优先解析函数声明所创建的函数,即"函数声明提升"现象,而函数表达式则会在Javascript引擎执行到它所在的行时才会进行解析;
2.函数表达式创建的变量在后面加上括号便立即调用此函数,如a(),函数声明的调用方式是 函数名+();
eg:
a();
function a(){
console.log(1)
};
b();
var b= function(){
console.log(2)
};
输出:
1
报错,函数表达式不会提前解析
接下来就可以介绍自执行函数了,一般它的格式如下:
(function (a){}(a))或(function (a){})(a),那么它属于函数声明还是函数表达式?
由上面的两种格式可知,函数对象后面直接机上括号就能执行,这种情况下,它属于函数表达式~
函数表达式的格式:
(function(a){ console.log(a); })(1); (function(a){ console.log(a); }(2)); !function(a){ console.log(a); }(3); +function(a){ console.log(a); }(4); -function(a){ console.log(a); }(5);
输出:
1
2
3
4
5
由此可只在函数前加上!+ -等运算符或使用()都能将之转换为自执行函数,但一般情况下,习惯使用()
自执行函数的一般用途:
javascript中没用私有作用域的概念,如果在多人开发的项目上,你在全局或局部作用域中声明了一些变量,可能会被其他人不小心用同名的变量给覆盖掉,
根据javascript函数作用域链的特性,可以使用这种技术可以模仿一个私有作用域,用匿名函数作为一个“容器”,
“容器”内部可以访问外部的变量,而外部环境不能访问“容器”内部的变量,
所以( function(){…} )()内部定义的变量不会和外部的变量发生冲突,俗称“匿名包裹器”或“命名空间”。
JQuery使用的就是这种方法,将JQuery代码包裹在( function (window,undefined){…jquery代码…} (window)中,在全局作用域中调用JQuery代码时,可以达到保护JQuery内部变量的作用。