javascript-- (function(){...})() 闭包

首先从我们常见的javascript函数开始:

function funName(){...};//函数声明,function关键字声明一个函数,再指定funame函数名
function(){...};//匿名函数,声明了函数但没指定函数名。 附给一个变量——函数表达式;附给一个事件——事件处理程序(object.onclick=function(){...};);创建闭包...
var funName=function(){...}; //函数表达式,将匿名函数附给一个变量。

function funName(){alert("hello world");}
funName();
//这样调用函数

function(){alert("hello World");}
(function(){alert("hello World");})();
//这样直接调用,或者(function(){alert("hello World");}());这两个没有区别哦

var fnName=function(){
    alert('Hello World');
}();
//函数表达式后加()直接调用  

function fnName(){
    alert('Hello World');
}();
//报错

如何传参

(function(a){alert(a);})(123);
new function(a){alert(a);}(123);

结论 X()要想通过加括号直接运行,那么X必须是一个函数表达式。(function(){alert("hello World");})();中外面的括号是一个分组操作符,会让解析器强制将JSON的花括号解析成表达式而不是代码块。

作用
(function(){...})()称为闭包。

  1. 匿名函数体内形成一个子作用域,这个子作用域可以调用外部作用域的变量,但外部作用域不可以调用子作用域的变量。这样便不会污染全局变量。

  2. 这种方式可以保存闭包外面的变量的状态
    举例

function fn() {
    for(var i=0 ; i<2; i++) {
        var variate= i;
        setTimeout(function() {
            alert(variate);
        }, 2000);
    }
} 
fn();//1,1

function fn() {
    for(var i=0 ; i<2; i++) {
    (function(){
        var variate= i;
        setTimeout(function() {
            alert(variate);
        }, 2000);
    })();
    }
} 
fn();//0,1

猜你喜欢

转载自blog.csdn.net/bjzhaoxiao/article/details/80510559
今日推荐