摘要:類型類型是的引用類型之一通過類型創(chuàng)建對象在中函數(shù)也以對象的形式存在每個函數(shù)都是一個對象構(gòu)造函數(shù)函數(shù)除了用函數(shù)定義語句和字面量表達式兩種方式定義之外還可以通過類型進行定義函數(shù)的參數(shù)和函數(shù)體都是以字符串形式傳遞給的通過類型定義函數(shù)的效率遠不如函
Function類型
Function類型是JS的引用類型之一 通過Function類型創(chuàng)建Function對象
在JS中 函數(shù)也以對象的形式存在
每個函數(shù)都是一個Function對象
console.log(Function instanceof Function) //true console.log(Function instanceof Object) //true console.log(Object instanceof Function) //true構(gòu)造函數(shù)
函數(shù)除了用函數(shù)定義語句和字面量表達式兩種方式定義之外 還可以通過Funcion類型進行定義
函數(shù)的參數(shù)和函數(shù)體都是以字符串形式傳遞給Function的
var fun = new Function ("num","console.log(num)"); fun(100); //100
通過Function類型定義函數(shù)的效率遠不如函數(shù)定義語句和字面量表達式的定義
定義函數(shù)的三種方式之間存在一定差別
函數(shù)定義語句:執(zhí)行時函數(shù)名被提前聲明 不存在效率問題
字面量表達式:函數(shù)體固定 無法動態(tài)執(zhí)行 不存在效率問題
Function類型定義 函數(shù)體是字符串 可以動態(tài)執(zhí)行 效率較低
Function的apply()方法apply方法可以劫持另外一個對象的方法,繼承另外一個對象的屬性.
Function.apply(obj,arguments)方法能接收兩個參數(shù)(可選):
obj:這個對象將代替Function類里this對象
arguments:這個參數(shù)是數(shù)組,它將作為參數(shù)傳給Function
如果沒有obj參數(shù) 那么Global對象被用作obj
//定義一個人類 function Person(name,age) { this.name=name; this.age=age; } //定義一個男人 function Man(name,age,hobby) { Person.apply(this,arguments); //this代表的是man arguments是一個數(shù)組 也就是["Sicong",30,"撕逼"] this.hobby=hobby; } var man=new Man("Sicong",30,"撕逼"); console.log("name:"+man.name +" "+ "age:"+man.age +" "+"hobby:"+man.hobby); //name:SicongWang age:30 hobby:撕逼 //用Man去執(zhí)行Person這個類里面的內(nèi)容,在Person這個類里面存在this.name等語句,這樣就將屬性創(chuàng)建到了student對象里面Function的call()方法
call方法與apply類似 只是第二個參數(shù)不是數(shù)組
//定義一個人類 function Person(name,age) { this.name=name; this.age=age; } //定義一個woman function Woman(name,age,hobby) { Person.call(this,name,age); //this代表的是woman this.hobby=hobby; } var woman=new Woman("TimoFeng",18,"唱歌"); console.log("name:"+woman.name +" "+ "age:"+woman.age +" "+"hobby:"+woman.hobby); //name:TimoFeng age:18 hobby:唱歌Function的bind()方法
bind方法與call和apply類似 第一個參數(shù)都是this要指向的對象 利用后續(xù)參數(shù)傳參數(shù)
不同的是bind是返回對應(yīng)的函數(shù) 可以稍后調(diào)用;call和apply是立即調(diào)用
var fn=function () { console.log(this.x) }; var foo={ x:3 }; fn(); //undefined console.log(fn.bind(foo)); //? () { // console.log(this.x) } // 此時this已經(jīng)指向了foo,但是用bind()方法并不會立即執(zhí)行,而是創(chuàng)建一個函 // 數(shù) 如果要直接調(diào)用的話 可以 bar.bind(foo)() var result=fn.bind(foo); result(); //3遞歸
在函數(shù)內(nèi)部,可以調(diào)用其他函數(shù)。如果一個函數(shù)在內(nèi)部調(diào)用自身本身,這個函數(shù)就是遞歸函數(shù)
遞歸函數(shù)的優(yōu)點是定義簡單,邏輯清晰 所有的遞歸函數(shù)都可以寫成循環(huán)的方式,但循環(huán)的邏輯不如遞歸清晰
遞歸調(diào)用的次數(shù)過多,會導(dǎo)致棧溢出 使用過深會造成死循環(huán)
var num=function(x){ if(x == 1){ return 1; } else{ return x*num(x-1); } } console.log(num(5)) //120 /* 計算過程為: ---> num(5) ---> 5 * num(4) ---> 5 * (4 * num(3)) ---> 5 * (4 * (3 * num(2))) ---> 5 * (4 * (3 * (2 * num(1)))) ---> 5 * (4 * (3 * (2 * 1))) 只有n=1時才特殊處理 ---> 5 * (4 * (3 * 2)) ---> 5 * (4 * 6) ---> 5 * 24 ---> 120 */回調(diào)函數(shù)
一個函數(shù)作為參數(shù)傳給另一個函數(shù) 我們把另一個函數(shù)稱為回調(diào)函數(shù)
通俗的說回調(diào)函數(shù)有3個特點: 1).你定義的 2).你沒有調(diào)用 3).但最后執(zhí)行了
回調(diào)函數(shù)的優(yōu)點:
- 可以在未命名的情況下傳遞函數(shù) 節(jié)省全局變量 - 將另一個函數(shù)調(diào)用操作委托給另一個函數(shù) - 有助于提升性能
$("btn").click(function(){ //click方法就是一個回調(diào)函數(shù) alert("我是一個按鈕") })自調(diào)用函數(shù)
自調(diào)用函數(shù) 聲明完了,馬上進行調(diào)用,只能使用一次
(function(num1,num2){ console.log(num1+num2) })(10,20) //30作用域和作用域鏈
作用域: 一塊代碼區(qū)域, 在編寫時就確定, 不會再變化
作用域鏈: 多個嵌套的作用域形成的由內(nèi)向外的結(jié)構(gòu), 用于查找變量
分為全局作用域和函數(shù)(局部)作用域
作用:
作用域: 隔離變量, 可以在不同作用域定義同名的變量不沖突
作用域鏈: 查找變量
var num1=10; //全局變量 function fn1(){ var num2=20; //fn1作用域的局部變量 function fn2(){ var num3=30; //fn2作用域的局部變量 function fn3(){ var num4=40; //fn3作用域的局部變量 console.log(num1); //10 console.log(num2); //20 console.log(num3); //30 console.log(num4); //40 } fn3(); console.log(num1); //10 console.log(num2); //20 console.log(num3); //30 console.log(num4); //num4 is not defined } fn2(); console.log(num1); //10 console.log(num2); //20 console.log(num3); //num3 is not defined console.log(num4); //num4 is not defined } fn1()閉包函數(shù)
當嵌套的內(nèi)部函數(shù)引用了外部函數(shù)的變量時就產(chǎn)生了閉包
閉包本質(zhì)是內(nèi)部函數(shù)中的一個對象, 這個對象中包含引用的變量屬性
作用:
延長局部變量的生命周期
讓函數(shù)外部能操作內(nèi)部的局部變量
避免污染全局命名空間
缺點:
變量占用內(nèi)存的時間可能會過長
可能導(dǎo)致內(nèi)存泄露(占用的內(nèi)存沒有及時釋放
內(nèi)存泄露積累多了就容易導(dǎo)致內(nèi)存溢出)
function fn1() { var a = 2; function fn2() { a++; console.log(a); //3 4 } return fn2; } var f = fn1(); f(); f();
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/108229.html
摘要:有個例外他就是??醋髠?cè)對象的原型鏈上是否有第一步得到。將各內(nèi)置引用類型的指向。用實例化出,,以及的行為并掛載。實例化內(nèi)置對象以及至此,所有內(nèi)置類型構(gòu)建完成。最后的最后,你還對是現(xiàn)有還是現(xiàn)有有想法了嗎以上均為個人查閱及實踐總結(jié)的觀點。 來個摸底測試,說出以下每個表達式的結(jié)果 function F(){}; var o = {}; typeof F; typeof o; typeof F...
摘要:如圖反而,由于這些的都是繼承自,所以原型鏈拐向了。因此這樣一個實例,他順著原型鏈是找到了如圖選學(xué)內(nèi)容如果我們刨根問底,去尋找和的根源的話,那這個問題又稍微有點復(fù)雜了。 基本類型 Number, Boolean, String, null, undefined 什么樣的變量是 undefined 聲明了變量卻沒賦值 未聲明的變量 包裝類型 其實js里面也有像java,c#里所謂的包裝...
摘要:對象類型常見的有,,,正則新增自己提供的樂行判斷如果不對對象做嚴格區(qū)分使用。的實現(xiàn)使用了原型繼承的表示左表達式,表示右表達式,它是用是否等于來判斷對象的類型的。常見框架和庫的實數(shù)據(jù)類型判斷測試這里將的實現(xiàn)原理抽取出來,用原生實現(xiàn)。 JavaScript一共有六種數(shù)據(jù)類型,分為原始類型(又名基本類型)和對象類型(又名引用類型) 原始類型有五種,分別為number,string,boole...
摘要:本文章主要總結(jié)一下數(shù)據(jù)類型的識別判斷方法最后封裝一個函數(shù),可以判別所有的類型數(shù)據(jù)類型基本類型類型該類型只有一個值,即小寫,在使用聲明變量但是未對其加以初始化時,這個變量的值就是。 *本文章主要總結(jié)一下js數(shù)據(jù)類型的識別判斷方法tyoeofinstanceofObject.prototype.toString.callconstructor最后封裝一個函數(shù),可以判別所有的類型* 1.數(shù)據(jù)...
摘要:面向?qū)ο蟾呒壚^承模式一原型鏈繼承方式原型鏈繼承流程定義父類型構(gòu)造函數(shù)。缺點無法避免構(gòu)造函數(shù)模式存在的問題方法都在構(gòu)造函數(shù)中定義,無法函數(shù)復(fù)用。六寄生組合式繼承在這里重復(fù)一下組合繼承的代碼組合繼承最大的缺點是會調(diào)用兩次父構(gòu)造函數(shù)。 JavaScript 面向?qū)ο蟾呒墶^承模式 一、原型鏈繼承 方式1: 原型鏈繼承 (1)流程: ? 1、定義父類型構(gòu)造函數(shù)。 ? ...
摘要:注意基本變量類型不是對象類型,只有基本包裝類型才是對象類型。至于顯示的原型,在里用屬性表示,這個是原型繼承的基礎(chǔ)知識,在這里就不在敘述了。 前言 如果你要開發(fā)一個復(fù)雜的產(chǎn)品,那么肯定少不了使用面向?qū)ο髾C制,當然也避不開 Javascript 里面的繼承,instanceof 運算符是原生 Javascript 語言中用來判斷實例繼承的操作符。所以我們有必要深入理解該運算符! inst...
閱讀 2435·2021-10-11 10:57
閱讀 1287·2021-10-09 09:59
閱讀 2001·2019-08-30 15:53
閱讀 3219·2019-08-30 15:53
閱讀 1015·2019-08-30 15:45
閱讀 747·2019-08-30 15:44
閱讀 3455·2019-08-30 14:24
閱讀 957·2019-08-30 14:21