JavaScript學習筆記(四)——函數表達式

匿名函數

var functionName = function(arg0, arg1,arg2){
  //do sth
};

作用:模仿塊級作用域

//用作會計作用域(私有作用域)的匿名函數的語法
(function(){
  //這里是塊級作用域
})(); //函數聲明加上括號即可

function output(count){
  (function(){
    for(var i = 0; i < count; i++ ){
      console.log(i);
    }
  })();

  console.log(i); // 出錯
}

遞歸

function factorial(num){
  if (num <= 1 ){
    return 1;
  } else {
    return num * arguments.callee(num - 1); //使用arguments.callee而不是函數名的原因是函數名可能會發(fā)生變化
  }
}

嚴格模式下使用命名函數

var factorial = (function f(num){
  if (num <= 1){
    return 1;
  } else {
    return num * f(num - 1);
  }
});

閉包

閉包是指有權訪問另一個函數作用域中的變量的函數。創(chuàng)建閉包常見的方式,就是在一個函數內部創(chuàng)建另一個函數。

當在函數內部定義了其他函數是,就創(chuàng)建了閉包。閉包有權訪問包含函數內部的所有變量,原理如下:

  • 在后臺執(zhí)行環(huán)境中,閉包的作用域鏈包含著它自己的作用域、包含函數的作用域和全局作用域。
  • 通常,函數的作用域及其所有變量都會在函數執(zhí)行結束后被銷毀。
  • 當函數返回了一個閉包是,這個函數的作用域將會一只在內存中保存到閉包不存在為止。
function createFunctions(){
  var result = new Array();
  for (var i = 0; i < 10; i++ ){
    result[i] = function(){
      return i;
    };
  }
  return result;
}

var result = createFunctions();
result.forEach(function(item, index, array){
  console.log(item());//10個10
});

每個函數都返回10,因為每個函數的作用域鏈中都保存著createFunctions()函數的活動對戲那個,所以它們引用的是同一個變量i。當createFunction()函數返回后,變量i的值都是10。

通過定義匿名函數,并將立即執(zhí)行該匿名函數的結果賦給數組可以解決這個問題:

function createFunctions(){
  var result = new Array();
  for (var i = 0; i < 10; i++ ){
    result[i] = function(num){
      return function(){
        return num;
      };
    }(i);
  }
  return result;
}

var result = createFunctions();
result.forEach(function(item, index, array){
  console.log(item());//0~9
});

作用:用于創(chuàng)建訪問私有變量的公有方法。

特權方法:有權訪問私有變量和私有函數的公有方法

//增強的模塊模式
var f = function(){
  //私有變量和私有函數
  var privateVar = 10;

  function privateFunction(){
    return false;
  }

  //創(chuàng)建對象
  var object = new CustomType();

  //添加特權/公有屬性和方法
  object.publicProperty = true;

  object.publicMethod = function(){
    privateVar++;
    return privateFunction();
  };

  return object;

}();

this

幾種特殊情況下,this的值可能會意外改變。

var name = "The Window";

var object = {
  name : "Object",

  getName : function(){
    return this.name;
  }
};

object.getName(); // 'Object"
(object.getName)(); // "Object"
(object.getName = object.getName)(); //"The Window"
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 定義函數的方式有兩種:函數聲明和函數表達式。 函數聲明的一個重要特征就是函數聲明提升,意思是在執(zhí)行代碼前會先讀取函...
    oWSQo閱讀 752評論 0 0
  • 本章內容 函數表達式的特征 使用函數實現遞歸 使用閉包定義私有變量 定義函數的方式有兩種:一種是函數聲明,另一種就...
    悶油瓶小張閱讀 450評論 0 0
  • 最近學這塊知識學得有些吃力。還有很多遺漏的地方,只能以后多看些書來彌補了。 第7章 函數表達式 函數定義的兩種方式...
    丨ouo丨閱讀 481評論 0 1
  • 定義函數的方法有兩種:函數聲明和函數表達式。 函數聲明 使用函數聲明時,函數聲明會被提升至當前作用域最前面。 但是...
    exialym閱讀 421評論 0 3
  • 你好 你好啊 無需列表 無需列表 有序列表 hahha 哈哈哈 你好啊
    乞力馬扎羅山雪閱讀 199評論 0 0

友情鏈接更多精彩內容