摘要:比如,以對(duì)象的方法的形式調(diào)用函數(shù)并傳入兩個(gè)參數(shù)可以傳入的參數(shù)可以是數(shù)組和類(lèi)數(shù)組的。方法的該方法主要作用是將函數(shù)綁定至某個(gè)對(duì)象,方法返回一個(gè)新的函數(shù),調(diào)用這個(gè)新的函數(shù)會(huì)把綁定的函數(shù)在對(duì)象中當(dāng)做方法來(lái)調(diào)用。
參數(shù)
形參(parameter):函數(shù)中定義的變量
實(shí)參(argument):運(yùn)行時(shí)的函數(shù)調(diào)用時(shí)傳入的參數(shù)
上下文(context):通過(guò)對(duì)象來(lái)調(diào)用函數(shù)時(shí),這個(gè)對(duì)象就是this就是上下文;
閉包(closure):函數(shù)嵌套在函數(shù)當(dāng)中
1 函數(shù)調(diào)用的方式有4種方法來(lái)調(diào)用JavaScript函數(shù):
作為函數(shù)
作為方法
作為構(gòu)造函數(shù)
通過(guò)call方法和apply方法間接調(diào)用
ES3 和非嚴(yán)格模式下的ES5中,調(diào)用上下文(this的值)是全局對(duì)象。在嚴(yán)格模式下,調(diào)用上下文則是undefined
1.1 函數(shù)調(diào)用語(yǔ)法:
functionName()
window.name = "hello"; (function () { console.log(this); //window })() "use strict"; window.name = "hello"; (function () { console.log(this); //undefined })()1.2 方法調(diào)用
語(yǔ)法:
obj.functionName()
方法和this關(guān)鍵字是面向?qū)ο缶幊桃?guī)范的核心
方法鏈
方法鏈:當(dāng)方法的返回值是一個(gè)對(duì)象,這個(gè)對(duì)象還可以再調(diào)用它的方法。這個(gè)方法調(diào)用序列就是方法鏈;
1.3 構(gòu)造函數(shù)調(diào)用沒(méi)有形參的構(gòu)造函數(shù)調(diào)用都可以省略小括號(hào)
1.4 間接調(diào)用call方法:使用它自有的實(shí)參列表作為函數(shù)的實(shí)參;
apply方法:要求以數(shù)組的形式傳入?yún)?shù);
2 函數(shù)的實(shí)參和形參 2.1 可選形參當(dāng)調(diào)用函數(shù)的時(shí)候傳入的實(shí)參比函數(shù)聲明時(shí)指定的形參個(gè)數(shù)要少,剩下的形參都將是undefined;所以在定義函數(shù)的時(shí)候應(yīng)當(dāng)給省略的參數(shù)賦一個(gè)默認(rèn)值:
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 實(shí)參對(duì)象
省略的實(shí)參都是undefined;多出的參數(shù)自動(dòng)忽略
另外,可以通過(guò)arguments來(lái)獲取多余的參數(shù),arguments.length獲得參數(shù)個(gè)數(shù)
不定實(shí)參函數(shù)(varargs function):接收任意個(gè)數(shù)的實(shí)參
不定實(shí)參函數(shù)的實(shí)參個(gè)數(shù)不能為零;
ES5之前,arguments[0]和x指代同一個(gè)值;
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 將對(duì)象屬性用作實(shí)參
最好通過(guò)名值對(duì)的形式傳入?yún)?shù)(傳入的實(shí)參都寫(xiě)入一個(gè)多帶帶的對(duì)象之中,在調(diào)用的時(shí)候傳入一個(gè)對(duì)象)
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ù)賦值給變量,存儲(chǔ)在對(duì)象的屬性和數(shù)組的元素中,作為參數(shù)傳入另外一個(gè)函數(shù)等
函數(shù)是對(duì)象,可以定義自己的屬性
log.conter = 10; function log () { console.log(log.conter); } log(); //10
這樣函數(shù)就不需要再定義一個(gè)全局變量
4作為命名空間的函數(shù)將代碼放入一個(gè)函數(shù)內(nèi),然后調(diào)用這個(gè)函數(shù):
不同的寫(xiě)法:
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)
小括號(hào)括起來(lái)避免JavaScript解釋器解析為函數(shù)聲明語(yǔ)句
5 閉包詞法作用域(lexical scoping):函數(shù)的執(zhí)行依賴(lài)于變量作用域,這個(gè)作用域是在函數(shù)定義時(shí)決定的,而不是函數(shù)調(diào)用時(shí)決定的。
閉包:函數(shù)對(duì)象可以通過(guò)作用域相互關(guān)聯(lián)起來(lái),函數(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
使用多個(gè)嵌套函數(shù):
function counter () { var num = 0; return { count: function () { return num ++; }, reset: function () { num = 0; } }; } var newCounter = counter(); //這里是新的計(jì)數(shù)器,再賦值一個(gè)變量可以得到另外一個(gè)計(jì)數(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í)參的數(shù)量
function add(x, y) { return arguments.length; } console.log(add.length); //2 console.log(add(1)); //16.2 prototype屬性 6.3 call()和apply()方法
通過(guò)調(diào)用方法的形式來(lái)間接調(diào)用函數(shù),call和apply的第一個(gè)實(shí)參是要調(diào)用函數(shù)的母對(duì)象,它是調(diào)用上下文。
比如,以對(duì)象o的方法的形式調(diào)用函數(shù)f()并傳入兩個(gè)參數(shù):f.call(o, 1, 2)
apply可以傳入的參數(shù)可以是數(shù)組和類(lèi)數(shù)組的。
6.4 bind()方法ES5的該方法主要作用是將函數(shù)綁定至某個(gè)對(duì)象,方法返回一個(gè)新的函數(shù),調(diào)用這個(gè)新的函數(shù)會(huì)把綁定的函數(shù)在對(duì)象中當(dāng)做方法來(lái)調(diào)用。
function add(y) { return this.x + y; } var o = { x: 100 }; var g = add.bind(o); console.log(g(100)); //200
柯里化(currying):除了第一個(gè)實(shí)參外,傳入bind的實(shí)參也會(huì)綁定至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對(duì)象可以去掉: 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)用的對(duì)象 7 函數(shù)式編程 7.1 使用函數(shù)處理數(shù)組
如要計(jì)算元素的平均值:
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ù)式編程風(fēng)格:
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ù),它接收一個(gè)或多個(gè)函數(shù)作為參數(shù),并返回一個(gè)新函數(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ù)式編程中被緩存起來(lái),這種緩存技巧就是“記憶”
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/79135.html
摘要:試用過(guò)幾回,不滿的地方,是一個(gè)框架,必須最好按它的方式來(lái)編碼,與混編,使用文件。經(jīng)過(guò)一翻網(wǎng)絡(luò)搜索,勉強(qiáng)明白了依賴(lài)更新的實(shí)現(xiàn)方式,便嘗試著自己去實(shí)現(xiàn)一個(gè)框架。如今有依賴(lài)更新這種技術(shù)的存在,我覺(jué)得找到了可能。 初接觸vue,驚為天人,它的更新方式極為取巧,但也是人們保持路人的原因:似乎沒(méi)有一個(gè)嚴(yán)格的數(shù)學(xué)證明保證按它的方式能精確更新到DOM。不過(guò)腦子里推演的似乎不會(huì)發(fā)生失敗,而且每次界面都能...
摘要:不過(guò)讓流行起來(lái)的原因應(yīng)該是是目前所有主流瀏覽器上唯一支持的腳本語(yǔ)言。經(jīng)過(guò)測(cè)試,數(shù)字字符串布爾日期可以直接賦值,修改不會(huì)產(chǎn)生影響。再考慮對(duì)象類(lèi)型為或者的情況。對(duì)于結(jié)果聲明其類(lèi)型。判斷對(duì)象的類(lèi)型是還是,結(jié)果類(lèi)型更改。 轉(zhuǎn)載自我的個(gè)人博客 歡迎大家批評(píng)指正 1. 第一個(gè)頁(yè)面交互 這里最需要學(xué)習(xí)的老師的代碼中,每一部分功能都由函數(shù)控制,沒(méi)有創(chuàng)建一個(gè)全部變量。且最后有一個(gè)函數(shù)來(lái)控制執(zhí)行代碼...
摘要:舉個(gè)例子在上面的例子可以看到,我們聲明是一個(gè)數(shù)字,但是我們?cè)谥髮⒌闹涤指某闪俗址筒紶栔岛竺鏁?huì)講這些類(lèi)型?;绢?lèi)型字符串表示一個(gè)字符串,如。因此,我們可以寫(xiě)一個(gè)函數(shù),用來(lái)精確檢測(cè)類(lèi)型。 showImg(https://segmentfault.com/img/remote/1460000017309509?w=850&h=572); 定義 1. 什么是數(shù)據(jù)類(lèi)型? 數(shù)據(jù)類(lèi)型,就是將...
摘要:簡(jiǎn)介原文鏈接簡(jiǎn)稱(chēng)是一種輕量級(jí),解釋型的編程語(yǔ)言,其函數(shù)是一等公民。標(biāo)準(zhǔn)的目標(biāo)是讓任何一種程序設(shè)計(jì)語(yǔ)言能操控使用任何一種標(biāo)記語(yǔ)言編寫(xiě)出的任何一份文檔。核心規(guī)定了如何映射基于的文檔結(jié)構(gòu),以便簡(jiǎn)化對(duì)文檔的任意部分的訪問(wèn)和操作。 JavaScript 簡(jiǎn)介 原文鏈接 JavaScript ( 簡(jiǎn)稱(chēng):JS ) 是一種 輕量級(jí),解釋型 的編程語(yǔ)言,其函數(shù)是一等公民。眾所周知,它是用于網(wǎng)頁(yè)開(kāi)發(fā)的腳...
摘要:更形象的我們還可以將面向?qū)ο罄斫鉃橐环N宗教信仰。這就導(dǎo)致面向?qū)ο蠼痰某绦騿T們?cè)趯?xiě)時(shí)就很難受。所以為了滿足信仰面向?qū)ο蠼痰男枨笸ㄟ^(guò)構(gòu)造函數(shù)的形式模擬了偽類(lèi)。這個(gè)套路的核心就是類(lèi)那么里沒(méi)有類(lèi)所以其實(shí)是通過(guò)構(gòu)造函數(shù)來(lái)模擬的偽類(lèi)。 JS面向?qū)ο笾?【概述】 在學(xué)習(xí)JS的面向?qū)ο笾?我們應(yīng)該先自問(wèn)這樣幾個(gè)問(wèn)題: 面向?qū)ο笫鞘裁匆馑? 學(xué)習(xí)面向?qū)ο蟮暮诵氖鞘裁? 為什么要學(xué)習(xí)面向?qū)ο?(它的...
閱讀 3360·2021-11-11 16:54
閱讀 3502·2021-10-11 10:58
閱讀 1246·2021-08-30 09:41
閱讀 1802·2019-08-30 15:54
閱讀 2025·2019-08-30 14:00
閱讀 2696·2019-08-29 17:13
閱讀 1656·2019-08-29 15:19
閱讀 601·2019-08-29 15:14