摘要:比如,以對象的方法的形式調(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,age2.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()); //26 函數(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)); //16.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()); //3006.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()()); //local6.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); //37.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)); //True7.3 不完全函數(shù) 7.4 記憶
記憶(memorization):部分結(jié)果在函數(shù)式編程中被緩存起來,這種緩存技巧就是“記憶”
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/79135.html
摘要:試用過幾回,不滿的地方,是一個框架,必須最好按它的方式來編碼,與混編,使用文件。經(jīng)過一翻網(wǎng)絡(luò)搜索,勉強明白了依賴更新的實現(xiàn)方式,便嘗試著自己去實現(xiàn)一個框架。如今有依賴更新這種技術(shù)的存在,我覺得找到了可能。 初接觸vue,驚為天人,它的更新方式極為取巧,但也是人們保持路人的原因:似乎沒有一個嚴格的數(shù)學證明保證按它的方式能精確更新到DOM。不過腦子里推演的似乎不會發(fā)生失敗,而且每次界面都能...
摘要:不過讓流行起來的原因應(yīng)該是是目前所有主流瀏覽器上唯一支持的腳本語言。經(jīng)過測試,數(shù)字字符串布爾日期可以直接賦值,修改不會產(chǎn)生影響。再考慮對象類型為或者的情況。對于結(jié)果聲明其類型。判斷對象的類型是還是,結(jié)果類型更改。 轉(zhuǎn)載自我的個人博客 歡迎大家批評指正 1. 第一個頁面交互 這里最需要學習的老師的代碼中,每一部分功能都由函數(shù)控制,沒有創(chuàng)建一個全部變量。且最后有一個函數(shù)來控制執(zhí)行代碼...
摘要:舉個例子在上面的例子可以看到,我們聲明是一個數(shù)字,但是我們在之后將的值又改成了字符串和布爾值后面會講這些類型?;绢愋妥址硎疽粋€字符串,如。因此,我們可以寫一個函數(shù),用來精確檢測類型。 showImg(https://segmentfault.com/img/remote/1460000017309509?w=850&h=572); 定義 1. 什么是數(shù)據(jù)類型? 數(shù)據(jù)類型,就是將...
摘要:簡介原文鏈接簡稱是一種輕量級,解釋型的編程語言,其函數(shù)是一等公民。標準的目標是讓任何一種程序設(shè)計語言能操控使用任何一種標記語言編寫出的任何一份文檔。核心規(guī)定了如何映射基于的文檔結(jié)構(gòu),以便簡化對文檔的任意部分的訪問和操作。 JavaScript 簡介 原文鏈接 JavaScript ( 簡稱:JS ) 是一種 輕量級,解釋型 的編程語言,其函數(shù)是一等公民。眾所周知,它是用于網(wǎng)頁開發(fā)的腳...
摘要:更形象的我們還可以將面向?qū)ο罄斫鉃橐环N宗教信仰。這就導(dǎo)致面向?qū)ο蠼痰某绦騿T們在寫時就很難受。所以為了滿足信仰面向?qū)ο蠼痰男枨笸ㄟ^構(gòu)造函數(shù)的形式模擬了偽類。這個套路的核心就是類那么里沒有類所以其實是通過構(gòu)造函數(shù)來模擬的偽類。 JS面向?qū)ο笾?【概述】 在學習JS的面向?qū)ο笾?我們應(yīng)該先自問這樣幾個問題: 面向?qū)ο笫鞘裁匆馑? 學習面向?qū)ο蟮暮诵氖鞘裁? 為什么要學習面向?qū)ο?(它的...
閱讀 3370·2021-11-11 16:54
閱讀 3526·2021-10-11 10:58
閱讀 1265·2021-08-30 09:41
閱讀 1809·2019-08-30 15:54
閱讀 2036·2019-08-30 14:00
閱讀 2710·2019-08-29 17:13
閱讀 1678·2019-08-29 15:19
閱讀 614·2019-08-29 15:14