成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JS語言核心——“函數(shù)”

EsgynChina / 2459人閱讀

摘要:比如,以對象的方法的形式調(diào)用函數(shù)并傳入兩個參數(shù)可以傳入的參數(shù)可以是數(shù)組和類數(shù)組的。方法的該方法主要作用是將函數(shù)綁定至某個對象,方法返回一個新的函數(shù),調(diào)用這個新的函數(shù)會把綁定的函數(shù)在對象中當做方法來調(diào)用。

參數(shù)

形參(parameter):函數(shù)中定義的變量

實參(argument):運行時的函數(shù)調(diào)用時傳入的參數(shù)

上下文(context):通過對象來調(diào)用函數(shù)時,這個對象就是this就是上下文;

閉包(closure):函數(shù)嵌套在函數(shù)當中

1 函數(shù)調(diào)用的方式

有4種方法來調(diào)用JavaScript函數(shù):

作為函數(shù)

作為方法

作為構(gòu)造函數(shù)

通過call方法和apply方法間接調(diào)用

ES3 和非嚴格模式下的ES5中,調(diào)用上下文(this的值)是全局對象。在嚴格模式下,調(diào)用上下文則是undefined

1.1 函數(shù)調(diào)用

語法:

functionName()

window.name = "hello";
(function () {
    console.log(this); //window
})()

"use strict";
window.name = "hello";
(function () {
    console.log(this); //undefined
})()
1.2 方法調(diào)用

語法:

obj.functionName()

方法和this關(guān)鍵字是面向?qū)ο缶幊桃?guī)范的核心

方法鏈

方法鏈:當方法的返回值是一個對象,這個對象還可以再調(diào)用它的方法。這個方法調(diào)用序列就是方法鏈;

1.3 構(gòu)造函數(shù)調(diào)用

沒有形參的構(gòu)造函數(shù)調(diào)用都可以省略小括號

1.4 間接調(diào)用

call方法:使用它自有的實參列表作為函數(shù)的實參;

apply方法:要求以數(shù)組的形式傳入?yún)?shù);

2 函數(shù)的實參和形參 2.1 可選形參

當調(diào)用函數(shù)的時候傳入的實參比函數(shù)聲明時指定的形參個數(shù)要少,剩下的形參都將是undefined;所以在定義函數(shù)的時候應(yīng)當給省略的參數(shù)賦一個默認值:

function pushArray(o, /* optional */ a) {
    if (a === undefined) a = [];
    // a = a || [];
    for (var property in o) a.push(property);
    return a;
}
var o = {
    name: "Oliver",
    age: 18
};
var a = ["friends"];
console.log(pushArray(o, a).toString()); //friends,name,age
2.2 實參對象

省略的實參都是undefined;多出的參數(shù)自動忽略

另外,可以通過arguments來獲取多余的參數(shù),arguments.length獲得參數(shù)個數(shù)

不定實參函數(shù)(varargs function):接收任意個數(shù)的實參

不定實參函數(shù)的實參個數(shù)不能為零;

ES5之前,arguments[0]和x指代同一個值;

function pushArray(a) {   
    console.log(a); //Array
    arguments[0] = 10;
    console.log(a); //Array
    console.log(arguments[0]); //10
}
var a = ["friends"];
pushArray(a);
2.3 將對象屬性用作實參

最好通過名值對的形式傳入?yún)?shù)(傳入的實參都寫入一個多帶帶的對象之中,在調(diào)用的時候傳入一個對象)

function outputString(obj) {
    var fname = obj.firstName,
        lname = obj.lastName,
        age = obj.age;
    console.log(`your fisrtName: ${fname}; lastName: ${lname}; age: ${age}`);
}
outputString({firstName: "Oliver", lastName: "Young", age: 18}); //your fisrtName: Oliver; lastName: Young; 
3 作為值的函數(shù)

函數(shù)也是值,可以將函數(shù)賦值給變量,存儲在對象的屬性和數(shù)組的元素中,作為參數(shù)傳入另外一個函數(shù)等

函數(shù)是對象,可以定義自己的屬性

log.conter = 10;
function log () {
    console.log(log.conter);
}
log(); //10

這樣函數(shù)就不需要再定義一個全局變量

4作為命名空間的函數(shù)

將代碼放入一個函數(shù)內(nèi),然后調(diào)用這個函數(shù):

不同的寫法:

function log (i) {
    console.log("hello" +i);
}
log(100);

(function log (i) {
    console.log("hello" + i);
}(100))

(function log (i) {
    console.log("hello" + i);
})(100)

小括號括起來避免JavaScript解釋器解析為函數(shù)聲明語句

5 閉包

詞法作用域(lexical scoping):函數(shù)的執(zhí)行依賴于變量作用域,這個作用域是在函數(shù)定義時決定的,而不是函數(shù)調(diào)用時決定的。

閉包:函數(shù)對象可以通過作用域相互關(guān)聯(lián)起來,函數(shù)體內(nèi)部的變量都可以保存在函數(shù)作用域內(nèi)。

上面的log.conter屬性就可以使用包括在閉包中:

var pro = (function() {
    var conter = 10;

    function log(argument) {
        console.log(conter++);
    }
    return log;
})();
pro(); //10
pro(); //11
pro(); //12

使用多個嵌套函數(shù):

function counter () {
    var num = 0;
    return {
        count: function () {
            return num ++;
        },
        reset: function () {
            num = 0;
        }
    };
}
var newCounter = counter(); //這里是新的計數(shù)器,再賦值一個變量可以得到另外一個計數(shù)器,兩者不受影響
console.log(newCounter.count()); //0
console.log(newCounter.count()); //1
console.log(newCounter.count()); //2
newCounter.reset();
console.log(newCounter.count()); //0
console.log(newCounter.count()); //1
console.log(newCounter.count()); //2
6 函數(shù)屬性、方法和構(gòu)造函數(shù) 6.1 length屬性

函數(shù)的length返回的是形參的數(shù)量;函數(shù)內(nèi)部arguments.length返回的是實參的數(shù)量

function add(x, y) {
    return arguments.length;
}
console.log(add.length); //2
console.log(add(1)); //1
6.2 prototype屬性 6.3 call()和apply()方法

通過調(diào)用方法的形式來間接調(diào)用函數(shù),call和apply的第一個實參是要調(diào)用函數(shù)的母對象,它是調(diào)用上下文。

比如,以對象o的方法的形式調(diào)用函數(shù)f()并傳入兩個參數(shù):f.call(o, 1, 2)

apply可以傳入的參數(shù)可以是數(shù)組和類數(shù)組的。

6.4 bind()方法

ES5的該方法主要作用是將函數(shù)綁定至某個對象,方法返回一個新的函數(shù),調(diào)用這個新的函數(shù)會把綁定的函數(shù)在對象中當做方法來調(diào)用。

function add(y) {
    return this.x + y;
}
var o = {
    x: 100
};
var g = add.bind(o);
console.log(g(100)); //200

柯里化(currying):除了第一個實參外,傳入bind的實參也會綁定至this;

function add(x, y) {
    return x + y;
}
var o = {

};
var g = add.bind(o, 100); //x是100
console.log(g(100)); //200 y是100

//上面的o對象可以去掉:
function add(x, y, z) {
    return x + y + z;
}
var g = add.bind(null, 100, 100, 100); //x是100 y是100 z是100
console.log(g()); //300

//又如:
function add(y, z) {
    return this.x + y + z;
}
var g = add.bind({x:100}, 100, 100); //{x是100} y是100 z是100
console.log(g()); //300
6.5 toString()方法 6.6 Function()構(gòu)造函數(shù)

Function()構(gòu)造函數(shù)所創(chuàng)建的函數(shù)并不是使用此法作用域:

var scope = "global";
function constructFunction () {
    var scope = "local";
    return new Function("return scope");
}
console.log(constructFunction()()); //global

var scope = "global";
function constructFunction () {
    var scope = "local";
    return function () {
        return scope
    };
}
console.log(constructFunction()()); //local
6.7 可調(diào)用的對象 7 函數(shù)式編程 7.1 使用函數(shù)處理數(shù)組

如要計算元素的平均值:

var arr = [1,2,3,4,5];
var total = 0;
for (var i = 0; i < arr.length; i++) {
    total += arr[i];
};
var result = total/arr.length;
console.log(result); //3

函數(shù)式編程風格:

var arr = [1,2,3,4,5];
function sum (a, b) {
    return a + b;
}
var total = arr.reduce(sum);
var result = total/arr.length;
console.log(result); //3
7.2 高階函數(shù)

高階函數(shù)(higher-order function):就是操作函數(shù)的函數(shù),它接收一個或多個函數(shù)作為參數(shù),并返回一個新函數(shù)

function reverse(fun) {
    return function () {
        var result = fun.apply(this, arguments);
        return !result;
    }
}
var even = function (x) {
    return x % 2 === 0;
};

var odd = reverse(even);
console.log(odd(100)); //False
console.log(even(100)); //True
7.3 不完全函數(shù) 7.4 記憶

記憶(memorization):部分結(jié)果在函數(shù)式編程中被緩存起來,這種緩存技巧就是“記憶”

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/79135.html

相關(guān)文章

  • 以vue依賴統(tǒng)計為核心的框架(函數(shù)),mve

    摘要:試用過幾回,不滿的地方,是一個框架,必須最好按它的方式來編碼,與混編,使用文件。經(jīng)過一翻網(wǎng)絡(luò)搜索,勉強明白了依賴更新的實現(xiàn)方式,便嘗試著自己去實現(xiàn)一個框架。如今有依賴更新這種技術(shù)的存在,我覺得找到了可能。 初接觸vue,驚為天人,它的更新方式極為取巧,但也是人們保持路人的原因:似乎沒有一個嚴格的數(shù)學證明保證按它的方式能精確更新到DOM。不過腦子里推演的似乎不會發(fā)生失敗,而且每次界面都能...

    Carl 評論0 收藏0
  • task0002(一)- JavaScript數(shù)據(jù)類型及語言基礎(chǔ)

    摘要:不過讓流行起來的原因應(yīng)該是是目前所有主流瀏覽器上唯一支持的腳本語言。經(jīng)過測試,數(shù)字字符串布爾日期可以直接賦值,修改不會產(chǎn)生影響。再考慮對象類型為或者的情況。對于結(jié)果聲明其類型。判斷對象的類型是還是,結(jié)果類型更改。 轉(zhuǎn)載自我的個人博客 歡迎大家批評指正 1. 第一個頁面交互 這里最需要學習的老師的代碼中,每一部分功能都由函數(shù)控制,沒有創(chuàng)建一個全部變量。且最后有一個函數(shù)來控制執(zhí)行代碼...

    elarity 評論0 收藏0
  • 33 個 js 核心概念(二):數(shù)據(jù)類型

    摘要:舉個例子在上面的例子可以看到,我們聲明是一個數(shù)字,但是我們在之后將的值又改成了字符串和布爾值后面會講這些類型?;绢愋妥址硎疽粋€字符串,如。因此,我們可以寫一個函數(shù),用來精確檢測類型。 showImg(https://segmentfault.com/img/remote/1460000017309509?w=850&h=572); 定義 1. 什么是數(shù)據(jù)類型? 數(shù)據(jù)類型,就是將...

    QiShare 評論0 收藏0
  • JavaScript 簡介

    摘要:簡介原文鏈接簡稱是一種輕量級,解釋型的編程語言,其函數(shù)是一等公民。標準的目標是讓任何一種程序設(shè)計語言能操控使用任何一種標記語言編寫出的任何一份文檔。核心規(guī)定了如何映射基于的文檔結(jié)構(gòu),以便簡化對文檔的任意部分的訪問和操作。 JavaScript 簡介 原文鏈接 JavaScript ( 簡稱:JS ) 是一種 輕量級,解釋型 的編程語言,其函數(shù)是一等公民。眾所周知,它是用于網(wǎng)頁開發(fā)的腳...

    URLOS 評論0 收藏0
  • JS面向?qū)ο笾?【概述】

    摘要:更形象的我們還可以將面向?qū)ο罄斫鉃橐环N宗教信仰。這就導(dǎo)致面向?qū)ο蠼痰某绦騿T們在寫時就很難受。所以為了滿足信仰面向?qū)ο蠼痰男枨笸ㄟ^構(gòu)造函數(shù)的形式模擬了偽類。這個套路的核心就是類那么里沒有類所以其實是通過構(gòu)造函數(shù)來模擬的偽類。 JS面向?qū)ο笾?【概述】 在學習JS的面向?qū)ο笾?我們應(yīng)該先自問這樣幾個問題: 面向?qū)ο笫鞘裁匆馑? 學習面向?qū)ο蟮暮诵氖鞘裁? 為什么要學習面向?qū)ο?(它的...

    JohnLui 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<