自执行函数

原文连接:https://my.oschina.net/u/2331760/blog/468672?p={{currentPage+1}}javascript

函数基本概念:java

函数声明:function box(){}jquery

函数表达式:var box = function(){};安全

匿名函数:function(){} 属于函数表达式闭包

    匿名函数的做用:若是将匿名函数赋值给一个变量,则声明了一个函数: var box= function(){};函数

            若是将匿名函数赋予一个事件则成为事件处理程序: box.addEventListener("click",function(){alert("aaa")});.net

            建立闭包:(function(){})()blog

函数定义的三种方法:事件

  var box = function(){};ip

  function box(){}

  var box = new Function();

函数声明和函数表达式的不一样:

  js在进行预解析时函数声明会提高,而函数表达式必须js顺序执行到此函数代码时才会逐行解析

  函数表达式后面加括号能够当即执行函数,函数声明不能够,只能以fnName()的方式调用才行

  实例:

box();
function box(){
  alert("aaa");  
}
//正常,由于js在解析阶段函数声明会被提高到最前面,因此函数声明能够在函数执行后面
//实际顺序
//function box(){
  alert("aaa");
}
//box();

box();
var box = function(){
  alert("aaa");
}
//报错,实际上的顺序是
//var box = undefined;
//box();
//box = function(){
  alert("aaa");
}
//因此当执行到box()时,此时box不是一个函数

var box = function(){
  alert("aaa");
}()
//正确 函数表达式后面加括号,当执行到后面的括号时js会自动执行此函数

function box(){
  alert("aaa");
}()
//不会报错,可是只会解析函数声明,忽略后面的括号,不会自执行

function(){
  alert("aaa")
}()
//语法错误
//虽然匿名函数属于函数表达式,但未进行赋值给一个变量
//当js解析到function时,将其当作函数声明,报错,须要一个函数函数名

 函数自执行

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

//"123" 使用()运算符

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

//"123" 使用()运算符

!function(a){
  alert(a);
}("123")
//"123" 使用!运算符

+function(a){
  alert(a);
}("123")
//"123" 使用+运算符

-function (a){
  alert(a);
}("123")
//"123" 使用-运算符

var fn= function(a){
  alert(a);
}("123")
//"123" 使用=运算符

  在function前面加!、+、-、=均可以将函数声明转化为函数表达式,消除了js引擎识别函数声明和函数表达式的歧义,

加()是最安全的方法,省得其余的和函数返回值进行运算

不过这样的写法有什么用呢?

 

javascript中没用私有做用域的概念,若是在多人开发的项目上,你在全局或局部做用域中声明了一些变量,可能会被其余人不当心用同名的变量给覆盖掉,

根据javascript函数做用域链的特性,可使用这种技术能够模仿一个私有做用域,用匿名函数做为一个“容器”,

“容器”内部能够访问外部的变量,而外部环境不能访问“容器”内部的变量,

因此( function(){…} )()内部定义的变量不会和外部的变量发生冲突,俗称“匿名包裹器”或“命名空间”。

 

JQuery使用的就是这种方法,将JQuery代码包裹在( function (window,undefined){…jquery代码…} (window)中,在全局做用域中调用JQuery代码时,能够达到保护JQuery内部变量的做用。

相关文章
相关标签/搜索