自執行函數

原文連接: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內部變量的做用。

相關文章
相關標籤/搜索