--------------记录自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;
}
}
}
复制代码