<script> //return能夠跳出當前函數 因此return寫在函數的最後一行 function out() { return function (){ console.log("inner-before") return "inner-fn"; console.log("inner-end") }; } var inner = out(); var str = inner(); console.log(str); </script>
輸出:
inner-before
inner-fn
由於inner-end 寫在return的後面,因此代碼沒有被運行,也就沒有輸出
在js中做用域通常都是函數做用域
<script> function test() { var a = "a"; console.log(a); }
test(); console.log(a);
輸出結果爲:a
還報了一個錯誤:a is not defined
由於a變量的值是定義在局部做用域中的
因此外面的 console.log(a)全局做用域訪問不到裏面 取不到定義的a變量的值
<script> /*全局做用域*/
function out() {
return function inner(){ return "inner-fn"; }; } var inner = out() ; </script>
this指向於誰
得看函數調用位置上的調用形式
普通調用 指向 --> window
隱式調用 指向 --> 調用對象
顯示調用 指向 --> 指定對象
構造調用 指向 --> 構造出來的對象(實例)
this的值一定是引用類型
<script> function test(a,b,c,d,f,){ } console.log(test.length); </script>
輸出結果爲:5
length屬性表示形參的個數
function test(flag,flag1) { console.log(this,flag,flag1) } test("普通調用","普通調用2") test.call({a:"a"},"call調用","call調用2"); call函數的第二個參數 是當前函數的第一個參數 test.apply({b:"b"});
call() apply()調用(顯示調用) 相比於 普通調用 能夠改變 函數內部的this指向
call() 和 apply() 傳參方式不同
分三步:
1.建立一個新的對象 --->原型
2.將this指向新的對象
3.默認構造函數的最後一步
return undefined
由於undefined是基本數據類型
return 新的對象
JS中是不存在構造函數的定義語法的,只有函數的構造調用,當一個函數被構造調用時(new),
當前這個函數就能夠被認爲是一個構造函數。
構造調用:
function Person(name,age) {
this.name = name;
this.age = age;
}算法
//無參構造調用 new Person
// 構造調用的時候 函數執行的最後一步: return this 這是一個隱式的操做
// 普通調用的時候 函數執行的最後一步: return undefined 這是一個隱式的操做數組
數組是一個有序的數據集合(數據能夠是原始類型 或 引用數據類型)var arr=[];
相對於變量 ,數組可用於在一個變量中存儲多個值。
數組中的每一項都有一個數字附於其上,被稱爲索引。JavaScript,數組索引 從0開始
JS數組中是能夠自動擴容的
靜態方法(構造函數身上的方法):
isArray :判斷是不是數組
obj:須要檢測的值
返回值:若是對象是Array,則爲true;不然爲false.
語法:Array.isArray(obj)
實例方法(實例身上的方法):
方法名: | 定義 | 語法 | 參數 | 返回值 | 是否影響老數組: |
push() | push() 方法將一個或多個元素添加到數組的末尾,並返回新數組的長度 | arr.push(element1, ..., elementN) | 被添加到數組末尾的元素 | 當調用該方法時,新的 length 屬性值將被返回 | 影響 |
unshift() | unshift() 方法將一個或多個元素添加到數組的開頭,並返回新數組的長度 | arr.unshift(element1, ..., elementN) | 要添加到數組開頭的元素 | 當一個對象調用該方法時,返回其 length 屬性值 | 影響 |
pop() | pop()方法從數組中刪除最後一個元素,並返回該元素的值。此方法更改數組的長度 | arr.pop() | 無 | 從數組中刪除的元素(當數組爲空時返回undefined) | 影響 |
shift() | shift() 方法從數組中刪除第一個元素,並返回該元素的值。此方法更改數組的長度 | arr.shift() | 無 | 從數組中刪除的元素; 若是數組爲空則返回undefined | 影響 |
concat() | concat() 方法用於合併兩個或多個數組。此方法不會更改現有數組,而是返回一個新數組 | arr.concat(arr1[, arr2[, ...[, arrN]]]) | valueN-->待連接的數組 | 新的 Array 實例 | 不影響 |
indexOf() | indexOf()方法返回在數組中能夠找到一個給定元素的第一個索引,若是不存在,則返回-1 | arr.indexOf(searchElement) | searchElement-->要查找的元素 | 首個被找到的元素在數組中的索引位置; 若沒有找到則返回 -1 | 不影響 |
lastIndexOf() | lastIndexOf() 方法返回指定元素在數組中的最後一個的索引,若是不存在則返回 -1 | arr.lastIndexOf(searchElement) | searchElement-->要查找的元素 | 數組中最後一個元素的索引,如未找到返回-1 | 不影響 |
join() | join() 方法將一個數組的全部元素鏈接成一個字符串並返回這個字符串 | arr.join(separator) | separator ---> 指定一個字符串來分隔數組的每一個元素。若是省略(),數組元素用逗號分隔。默認爲 ","。 | 一個全部數組元素鏈接的字符串。若是 arr.length 爲0,則返回空字符串 | 不影響 |
toString() | toString() 返回一個字符串,表示指定的數組及其元素。 | arr.toString() | 無 | 返回一個字符串。 | 不影響 |
方法名: | 定義 | 參數 | 返回值 | 是否影響老數組 |
forEach() | forEach() 方法對數組的每一個元素執行一次提供的函數。 | 參數1:callback (item index arr)app 參數2:thisArg可選參數。當執行回調 函數時用做this的值。函數 |
undefined | 由callback決定 |
every() | every() 方法測試數組的全部元素是否都經過了指定函數的測試 | 參數1:callback (item index arr)測試 參數2:thisArg可選參數。當執行回調 函數時用做this的值。this |
true false | 由callback決定 |
some() | some() 方法測試數組中的某些元素是否經過由提供的函數實現的測試 | 參數1:callback (item index arr) 參數2:thisArg可選參數。當執行回調 函數時用做this的值。spa |
true false | 由callback決定 |
filter() | filter() 方法建立一個新數組, 其包含經過所提供函數實現的測試的全部元素。 | 參數1:callback (item index arr) 參數2:thisArg可選參數。當執行回調 函數時用做this的值prototype |
一個新的經過測試的元素的集合的數組 | 由callback決定 |
sort() | sort() 方法使用in-place算法對數組的元素進行排序,並返回數組。 默認排序順序是根據字符串Unicode碼點。 |
默認從小到大排序a-b(從小到大) b-a(從大到小) | 返回排序後的數組 | 影響 原數組已經被排序後的數組代替。 |
reverse() | Reverse() 方法顛倒數組中元素的位置,並返回該數組的引用 | 語法: arr.reverse() 參數:無 |
該數組的引用。 | 影響 |
map() | map() 方法建立一個新數組,其結果是原數組中的每一個元素都調用一個提供的函數後返回的結果。 | 參數1:callback (item index arr) 參數2:thisArg可選參數。當執行回調 函數時用做this的值指針 |
一個新數組,每一個元素都是回調函數的結果。 | 由callback決定 |
slice() | slice() 方法返回一個從開始到結束(不包括結束,左閉右開)選擇的數組的一部分淺拷貝到一個新數組對象 | begin可選調試 end slice(begin,end):[begin,end) |
返回值:一個含有提取元素的新數組 | 不影響 |
splice() | splice() 方法經過刪除現有元素和/或添加新元素來更改一個數組的內容 | 參數: start 從start開始刪 |
由被刪除的元素組成的一個數組 | 影響 |
reduce() | reduce() 方法對累加器和數組中的每一個元素(從左到右)應用一個函數,將其減小爲單個值。 | 參數1:callback (current,item,index,arr) 參數2:initialValue 若是沒有提供初始值,則將使用數組中的第一個元素。 在沒有初始值的空數組上調用 reduce 將報錯。 |
累加器的值 | 不影響 |
輸出結果爲:[2,3,4,5,6,7,9]
第一步,先用sort()方法對數組進行排序。
第二步,建立一個新的空數組用來存放去重以後的數組
第三步,默認放入排序後數組的第一個元素,而後判斷數組中的每個元素是否等於當前元素的前一個元素,再用push()方法,若是相等就不放進去新的數組,若是不相等就放入新的數組。
var arr =new Array(4) //不會拿undefined來填充默認值 empty *4
var arr[];arr.length=4
具備length屬性的對象(屬性名是字符串類型的數字)
一般拿到一個僞數組時,都須要將僞數組轉爲真數組(經過Array.prototype.slice.call/apply)將僞數組轉換爲真數組
var obj ={};
obj.length=3;
obj["0"]="a";
obj["1"]="b";
obj["2"]="c";
//每個實例對象的實例方法 都是去 它構造函數的原型上找的
var arr = Array.prototype.slice.call(obj)
console.log(arr);
arr.map(function (item) {
console.log(item)
})
arguments(函數內部屬性)是一個類數組
包含着傳入函數中的全部參數。雖然 arguments 的主要用途是保存函數參數,
但這個對象還有一個名叫 callee 的屬性,該屬性是一個指針,指向擁有這個 arguments 對象的函數。
從 ES5 規範開始就容許在列表(數組值、屬性列表等)末尾多加一個逗號(在實際處理中會被忽略不計)。
因此若是你在代碼或者調試控制檯中輸入 [ , , , ] ,實際獲得的是 [ , , ] (包含三個空單元的數組
function factorial2(num) {
// console.log(arguments.callee == factorial)
if(num<=1){
return 1;
}else{
return num * arguments.callee(num-1);
}
}
var res = factorial2(4);
console.log(res)
//遞歸的思想 本身調本身
用argument.callee指代函數本身自己
語法: var arr = [[]];
var arr = [[3,8,2],[2,7],[9,0,1,6]];
for(var i=0;i<arr.length;i++){
for(var j=0;j<arr[i].length;j++){
document.write(arr[i][j]+" ");
}
document.write("<br/>");
}