【廢棄】【WIP】JavaScript 函數

建立: 2017/10/09
更新: 2017/11/03 加上【wip】數組

廢棄: 2019/02/19 重構此篇。原文納入廢棄閉包

         增長【廢棄中】標籤與整體任務app

結束: 2019/03/12 完成廢棄, 刪除【廢棄中】標籤, 添加【廢棄】標籤函數

結束: 2019/03/03 完成廢棄, 刪除【廢棄中】標籤, 添加【廢棄】標籤this

【TODO】
// TODO: 第9章 關於函數的構造函數呼出與call, apply
// TODO 8.7 補充即時函數用途
// TODO: 補充JavaScript編譯過程, p179
// TODO: 8.8及之後

 函數的定義
  全部聲明不分順序,自動排序
 普通聲明  function test(a) {
    return a;
 }
 只有這種在定義後在程序任何位置均可以呼出
 函數字符來定義

 var sample = function(a) {
    return a;
 }
 呼出: sample(123);spa

不會被預處理prototype

 

 Object來定義

 var name = new function("x", "y", ... , "process")線程

 最後一個是處理,前面都是參數指針

 不會被預處理code

 

 箭頭函數式來定義

 var sample = x => x*x;

 不會被預處理

   
 嵌套函數  函數內部的函數
 位置  函數內部
 只能夠在函數內部的"最外側"(不能在if,for裏面)
   一樣聲明上卷,做爲函數內部的屬性
   只能從定義的函數內部呼出
   
   
   
   
   
   
   
   
   
 函數的呼出
 函數的呼出方法  function sample() {}
 最普通的  sample();
 屬性函數  object.func_name();
 呼出構造函數  new Object(); // TODO: 第9章
 call, apply  // TODO: 第9章
   
   
   
   
   
   

 即時函數

 (無名函數)

 定義與呼出同時進行
 
 普通  var f = function() {...};
 f();
 其餘寫法  (function() {...}) ();
   (function() {...} ());
   +function() {...} ();
 我的喜歡的寫法

 能夠帶名字,只有函數內部能夠用該名稱

 

  +function a(args) { a(); } (args);
 用途  構造不污染全局空間的命名空間
// TODO 8.7 補充即時函數用途
   
   
   
   
   
   
   
 函數的參數
  參數的省略  省略掉的爲undefined
 undefined是沒有賦值
 null是賦予的是空值
 不固定長度的參數  全部函數內部可用arguments
   Arguments Object
 自帶屬性  
 length  參數數量
 callee  如今執行的函數
   
   
   
 獲取參數的方法  arguments[0]
 arguments[1]
 ...
 轉換成數組  var params = [].slicce.call(arguments);
 定義無限長的參數的函數

 用arguments獲取參數 

function sample(a) {
    var result = a;
    for(var i = 1; i < arguments.length; i++) {
        s += arguments[i];
    }
    return result;
}

 

 

   
   
   
   
   
 傳值和傳參  object參數傳送的是參照(指針)
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
 遞歸函數
 三種寫法  
 普通   function sample(...) {
    if (...) {
sample(...);
    }
 }
 帶一個本地可用名的無名函數  var sample = function f(...) {
    if (...) {
       f(...);
    }
 }
 不帶本地名的無名函數  var sample = function(...) {
    if (...) {
       arguments.callee(...);
    }
 }
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
 程序的編譯與運行
 生成全局對象  
 解析程序  
 運行程序  
 單線程  
 call對象及本地變量  
 this的值

 被呼出函數所屬對象

 函數內部函數的this是全局變量

 命名空間

 

var a = "a";
function f() {
    var b = "b";
    function g() {
        var c = "c";
        console.log(a+b+c);
    }
}
f();

 

 

 垃圾回收

 釋放從全局對象沒法到達的量

 不用在乎 

   
   
   
   
   
   
   
   
   
   
 閉包
   JavaScript的全部函數都是閉包
 閉包內部能夠有函數(閉包)
 應用  
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
 命名空間
   
 用對象管理程序本地代碼  
 用函數管理  +function () { ... } (); 




   
   
   
   

 

 用對象管理程序本地代碼  
var myApp = myApp || {};
myApp.login = ...;
myApp.configs = {}; //部分空間內部再劃分部分空間

 


 全部東西追加成屬性
 用函數做爲命名空間  
(function () {
    // 程序全部內容寫在這裏
})();

 

module模式

// 做爲即時函數,把module相關傳遞給指定參數
var Module = Module || {};
(function (_module) {
    var name = "none"; // 私有變量
    function getName () { // 私有方法
      return name;
    }
    _module.showName() = function () { // 公共方法
      console.log(getName());
    }

})(Module);

 

 

   
   
   
   
   
   
   
   
   
   
   
   
   
   
 做爲對象(Object)的函數
 函數也是對象

 ● 能夠代入變量,對象屬性, 數組元素

 ● 能夠做爲函數的參數, 返回值

 ● 能夠有屬性和方法

 ● 能夠做爲不帶名字的字符, 即無名函數 function () {}

 ● 能夠動態生成

 函數的屬性(property)

 

 caller  呼出如今運行的函數的函數
 length  參數表長度
 name  函數名
 prototype

 prototype對象

 apply()

 指定this和參數運行函數

 參數用數組指定 

function test(a, b) { ... }
test.apply(thisTarget, [a, b]);

 

 call()

 指定this和參數運行函數

 參數以正常函數呼出形式指定

test.apply(thisTarget, a, b);

 

 bind()

 把函數的this綁定指定對象, 返回生成的新函數

function test() { return this.name }
var tom = { name: "none" };
var newTest = test.bind(tom);

 

 constructor()  Function constructor的參照
 toString()  把函數源代碼以String形式返回
   

 

 

 添加自定義屬性  
function test() {...}
test.newProperty = "sample"; // 和其餘對象添加屬性同樣寫法

 

   
   
   
   
   
   
   
   
   
   
   
   
   
 高階函數
 定義  以函數爲參數或返回值的函數
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
 回調函數
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
 ES6關於函數的擴張
相關文章
相關標籤/搜索