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