--------------記錄自JS高級視頻中的學習筆記包括了函數進階,apply,call,bind方法的使用,閉包,遞歸,淺拷貝與深拷貝,沙箱.數組
function f1(){
console.log("函數聲明");
}
f1();
複製代碼
var f2 = function(){
console.log("函數表達式");
};
f2();
複製代碼
function f1(){}
f1();
複製代碼
function F1(){}
var f = new F1();
複製代碼
function F1(){
this.f1 = function(){};
}
var f = new F1();
f.f1();
複製代碼
var arr = [1, 100, 20, 200, 40, 50, 120, 10];
//排序---函數做爲參數使用,匿名函數做爲sort方法的參數使用,那麼此時的匿名函數中有兩個參數,
arr.sort(function (obj1,obj2) {
if(obj1>obj2){
return -1;
}else if(obj1==obj2){
return 0;
}else{
return 1;
}
});//從小到大排序
複製代碼
//獲取某個對象的類型是否是你傳入的類型
//[10,20,30] 是否是"[object Array]"
//type---是變量----是參數----"[object Array]"
//obj---是變量-----是參數----[10,20,30];
//判斷這個對象和傳入的類型是否是同一個類型
function getFunc(type) {
return function (obj) {
return Object.prototype.toString.call(obj) === type;
}
}
var ff = getFunc("[object Array]");
var result = ff([10, 20, 30]);
console.log(result);//true
var ff1 = getFunc("[object Object]");
var dt = new Date();
var result1 = ff1(dt);
console.log(result1);//false
複製代碼
function f1(x,y){
console.log((x + y) + ":===>" + this);
}
//apply 和 call調用
f1.apply(null,[1,2]);//3:===>[object Window]
f1.call(null,1,2);//3:===>[object Window]
//改變this的指向
var obj = {
};
f1.apply(obj,[1,2]);//3:===>[object Object]
f1.call(obj,1,2);//3:===>[object Object]
複製代碼
function A(age){
this.age = age;
}
A.prototype.a = function(){
console.log(this + "===>" + this.age);
}
function B(age){
this.age = age;
}
var aObj = new A(10);
var bObj = new B(20);
//複製了一份
var c = aObj.a.bind(bObj);
c();//[object Object]===>20
複製代碼
function ShowRandom(){
//1-10的隨機數
this.number = parseInt(Math.random()*10 + 1);
}
//添加原型方法
ShowRandom.prototype.show1 = function(){
//改變了定時器中的this的指向了,原本應該是window,如今爲實例對象
window.setInterval(this.show2.bind(this),1000);
};
//添加原型方法
ShowRandom.prototype.show2 = function(){
//顯示隨機數--
console.log(this.number);
};
//實例對象
var sr = new ShowRandom();
//調用方法,輸出隨機數字
//調用這個方法一次,能夠不停的產生隨機數字
sr.show1();
複製代碼
//函數模式的閉包
function f1(){
var num = 10;
//函數的聲明
function f2(){
console.log(num);
}
//函數調用
f2();
}
f1();//10
//對象模式的閉包:函數中有一個對象
function f3(){
var num = 10;
var obj = {
age : num
}
console.log(obj.age);//10
}
複製代碼
function f1(){
var num = parseInt(Math.random()*10 + 1);
return function (){
console.log(num);
}
}
var ff = f1();
ff();//3(隨機的)
ff();//3
ff();//3
複製代碼
(function (){
var num = 10;
console.log(num + 10);
}());
複製代碼
(function (){
var str = "小白喜歡小黑";
str = str.substr(2);
console.log(str);//喜歡小黑
}());
(function (){
var str = "小明喜歡小紅";
str = str.substr(2);
console.log(str);//喜歡小紅
}());
複製代碼
//遞歸實現:求n個數字的和
//函數的聲明
function getSum(x){
if(x==1){
return 1;
}
return x + getSum(x - 1);
}
//函數的調用
console.log(getSum(5));//15
/*
*
* 執行過程:
* 代碼執行getSum(5)--->進入函數,此時的x是5,執行的是5+getSum(4),此時代碼等待
* 此時5+getSum(4),代碼先不進行計算,先執行getSum(4),進入函數,執行的是4+getSum(3),等待, 先執行的是getSum(3),進入函數,執行3+getSum(2),等待,先執行getSum(2),進入函數,執行 2+getSum(1);等待, 先執行getSum(1),執行的是x==1的判斷,return 1,因此,
* 此時getSum(1)的結果是1,開始向外走出去
* 2+getSum(1) 此時的結果是:2+1
* 執行:
* getSum(2)---->2+1
* 3+getSum(2) 此時的結果是3+2+1
* 4+getSum(3) 此時的結果是4+3+2+1
* 5+getSum(4) 此時的結果是5+4+3+2+1
*
* 結果:15
*
*
*
* */
複製代碼
function getEverySum(x){
if(x<10){
return x;
}
//獲取的是這個數的個位數
return x%10 + getEverySum(parseInt(x/10));
}
console.log(getEverySum(1364));//14
複製代碼
function getFib(x){
if(x==1 || x==2){
return 1;
}
return getFib(x-1) + getFib(x-2);
}
console.log(getFib(12));//144
複製代碼
//做用:把一個對象的屬性複製到另外一個對象中,淺拷貝
//把a對象中的全部的屬性複製到對象b中
function extend(a,b){
for(var key in a){
b[key] = a[key];
}
}
複製代碼
//經過函數實現,把對象a中全部的數據深拷貝到對象b中
function extend(a,b){
for(var key in a){
//先獲取a對象中每一個屬性的值
var item = a[key];
//判斷這個值是否是數組
if(item instanceof Array){
//若是是數組,那麼在b對象中添加一個新的屬性,而且這個屬性值也是數組
b[key] = [];
//調用這個方法,把a對象中的這個數組的屬性值一個個的複製到b對象的這個數組屬性中
extend(item,b[key]);
}else if(item instanceof Object){//判斷在這個值是否是對象類型的
//若是是對象類型的,那麼在b對象中添加一個屬性,是一個空對象
b[key] = {};
//再次調用這個函數,把a對象中的屬性對象的值一個一個複製到b對象的這個屬性對象中
extend(item,b[key]);
}else{
//若是值是普通的數據,直接複製到b對象整過屬性中
b[key] = item;
}
}
}
複製代碼