天天看點

JS 函數通路方式總結

一 函數申明、函數表達式、對象

函數申明毫無疑問,沒有調用的情況下,裡面的變量、函數都是不能夠通路到的

function MyObject() {
    var privateVarible = ;

    function privateFunction() {
        return false;
    }

    this.publicMethod = function() {
        return true;
    }
}
           

函數表達式,相當于調用函數申明,如下

function MyObject() {
    var privateVarible = ;

    function privateFunction() {
        return false;
    }

    this.publicMethod = function() {
        return true;
    }
}

var run = MyObject();
           

var run = MyObject();是函數表達式,run是其引用,無論是run.privateVarible、run.privateFunction()、run.publicMethod()都是通路不到的,因為function MyObject(){…}沒有傳回值。

function MyObject() {
    var privateVarible = ;

    function privateFunction() {
        return false;
    }

    this.publicMethod = function() {
        return true;
    }

    return this;
}

var run = MyObject();

alert(run.publicMethod());
           

有了傳回值後是可以通路run.publicMethod()的,但由于隻傳回了this對象run.privateVarible、run.privateFunction()還是不能通路到,這樣就實作了私有屬性和公有屬性的效果。

下面代碼中test是自運作的,是函數表達式,可以通路到其中的test.f1()、test.f2()。

var test = (function(){

    function f1(){
        alert("f1");
    }

    function f2(){
        alert("f2");
    }

    return {
        f1:f1,
        f2:f2
    };
})();
           

對象,如果把下面函數申明當做構造函數來用的話

function MyObject() {
    var privateVarible = ;

    function privateFunction() {
        return false;
    }

    this.publicMethod = function() {
        return true;
    }
}

var run = new MyObject();
           

run就是一個執行個體化的對象了,run.publicMethod()肯定是能夠通路的,但run對象隻有一個屬性就是publicMethod。

二 使用對象的屬性方式通路

var test = {

    f1: function (){
        alert("f1");
    },
    f2: function (){
        alert("f2");
    }
}

test.f1();
           

這樣同樣是能通路的。

用途一:

寫一些配置檔案(常量),讓代碼更加規範

var APP = {
    control: "vote-control",
    answer : "vote-answer",
    result : "vote-result",
    rush: "vote-rush",
    server:"voteSer",
    select: "vote-select",
    main:"vote-main",
    edit:"vote-edit",
    justsink:"JustSink"
};
           

用途二:

寫工具類,作為基礎工具使用

var shellcmd = {};
/**
 * 打開程式
 */
shellcmd.shellExecute = function (filePath) {
    var def = jQuery.Deferred();
    ...
}
/**
 * 讀檔案,同步
 * @param filePath
 * @returns {string}
 */
shellcmd.readFile = function (filePath) {
    if (!filePath)
     ...
    }
}
/**
 * 寫檔案,同步
 * @param {!string} content 可選,如果為空則認為是寫入空字元串
 * @param {!string} filePath 檔案路徑
 */
shellcmd.writeFile = function (filePath, content) {
    var path=require('path');
    ...
}
/**
 * 拷貝檔案
 * @param {!string} content 可選,如果為空則認為是寫入空字元串
 * @param {!string} filePath 檔案路徑
 */
shellcmd.copyFile = function (src, des) {
    var defer = jQuery.Deferred();
    ...
}
           

三 最普通的通路方式

在一個js檔案中建立很多的 function ,在引入該js後直接調用所需的方法,我感覺這樣代碼的可讀性較差。

var http = require('http');
var fs = require('fs');

function loader(config) {
    ...
}

/**
 * 同步本地應用清單資料
 * @param callback
 * @param callback.info APP資料
 */
function syncLocalAppList(callback) {
    ...
}

//判斷plugins檔案夾是否存在
function fnmkdir(config) {
    ...
}