day0319-程序员宅基地

技术标签: qianfeng  

day0319

参数

形参和实参

//a,b形参
//执行fn1(3,4)  3,4是实参
function fn1(a,b){
    

}

fn1(3,4);

注意传入参数为普通类型与引用类型的区别

普通类型:给个相同值
引用类型:指向同一地址

如果实参数量小于形参数量,那么最后没有赋值的形参则是undefined
如果形参属性小于实参数量,那么多出阿来的实参无法从形参上获取(对应不上)

function fn1(a,b,c,d){
    

}
fn1(3,4,5);


function fn1(a, b, c, d) {
    

}
fn1(3, 4, 5, 6, 7);

在这里插入图片描述
此处未给函数的形参b传参,b为undefined,但是函数可执行不报错,数值+undefined为NaN

function sum(a,b){
        
console.log(res);
console.log(a);
console.log(b);
console.log(1+undefined);
var res = a + b;    
console.log(String(res));
console.dir(res);
return true;    
return res; 
} 

var res = sum(1); 

alert(res)

在这里插入图片描述
形参初始值,当实参没有传入对应的值,默认是形参初始值(实参是undefined),如果传入则是传入值

必要的形参定义在函数的前面,非必要的形参定义在后面,大多数的初始值都是针对非必要的形参

形参中ES5是不能设置形参初始值,ES6中形参可以设置初始值

严格模式 之后再说

以为js是弱引用类型,所以参数是不需要设置类型的

如果封装的函数被比如人使用时,别人传入的参数不一定类型相同,会造成函数不可预期的错误

ES6中…arg

ES6中调用所有参数
传入不定数量的参数时会被放在arg这个数组

function fn1(...arg){
    
console.log(arg);
}

fn1(1,2,3,4,5)

在这里插入图片描述
…arg必须放在形参的最后

function fn1(fn,...arg){
    
    console.log(arg);
}
ES5中 arguments

arguments 是一个类数组对象。代表传给一个function的参数列表

ES5 函数内部arguments 参数列表 实参列表

arguments 对象只能在函数内使用

function fn1(){
    
    var s=0;
    for(var i=0;i<arguments.length;i++){
    
        s+=arguments[i];
    }
    return s;
}

var sum=fn1(1,2,3,4,5,6);
console.log(sum);

在这里插入图片描述

arguments.length 在函数内是当前函数传入的 实参数量
fn1.length通过获取函数的length可以获取到函数的 形参数量

function fn1(a,b,c,d){
    
    console.log(arguments.length);
    console.log(fn1.length);
}
fn1(1,2,3,4,5,6,7);

在这里插入图片描述

arguments的属性

arguments.length 传递给函数的参数数量
arguments.callee 指向参数所属的当前执行的函数 英文含义 被召者
arguments.callee.caller 当前函数的环境外(上下文)函数,不是函数显示null 召唤者

function fn1(fn){
    
console.log(arguments.callee);//就是当前函数
console.log(arguments.callee.name);//就是当前的名字
console.log(arguments.callee.caller);//调用当前函数的环境外(上下文)函数,不是函数显示null
}
function fn2(){
    
    fn1();
}

fn1();
fn2();

在这里插入图片描述
callee 是 arguments 对象的一个属性。它可以用于引用该函数的函数体内当前正在执行的函数。这在函数的名称是未知时很有用,例如在没有名称的函数表达式 (也称为“匿名函数”)内。

使用arguments.callee实现匿名递归

function fn1(fn){
    
    fn(0);
}

fn1(function(a){
    
    a++;
    console.log(a);
    if(a>3) return;
    arguments.callee(a);
})

在这里插入图片描述

return

遇到return,跳出函数,不再执行return后面的语句

function fn1(){
    
    var a=1;
    console.log(a+5);
    return;
    console.log(a);
}

fn1();

在这里插入图片描述
使用return返回一个运行结果,或者一个值,仅能返回一个值
返回的结果可以在函数执行时赋值给变量

function fn1(){
    
    var a=1;
    var b=2;
    return a+b;
}

var s=fn1();
console.log(s);

在这里插入图片描述

用return进行限制

限定函数传入参数类型或者其他的范围,来判断是否继续执行该函数还是跳出

function fn1(a){
    
    if(!a) return;
    var s=a+5;
    console.log(s);
}

fn1(5);
fn1();

在这里插入图片描述

用return多分支条件退出

输入数值转中文:用到数组

function getChineseNumber(n){
    
	if(n>=1000) return;
	if(n<11) return arr[n];
	if(n<20) return "十"+arr[n%10];
	if(n%10===0 && n<100) return arr[n/10]+"十";
	if(n<100) return arr[parseInt(n/10)]+"十"+arr[n%10];
	if(n%100===0) return arr[n/100]+"百";
	if(n%10===0) return arr[parseInt(n/100)]+"百"+arr[n/10%10]+"十";
	if(parseInt(n/10)%10===0) return arr[parseInt(n/100)]+"百零"+arr[n%10];
	return arr[parseInt(n/100)]+"百"+arr[parseInt(n/10)%10]+"十"+arr[n%10];
}
var str=getChineseNumber(265);
console.log(str);

在这里插入图片描述

运算:

function getSum(type){
    
    var s;
    switch(type){
    
        case "+":
        s=arguments[1];
        for(var i=2;i<arguments.length;i++)s+=arguments[i];
        return s;
        case "-":
        s=arguments[1];
        for(var i=2;i<arguments.length;i++)s-=arguments[i];
        return s;
        case "*":
        s=arguments[1];
        for(var i=2;i<arguments.length;i++)s*=arguments[i];
        return s;
        case "/":
        s=arguments[1];
        for(var i=2;i<arguments.length;i++)s/=arguments[i];
        return s;
    }
}

var s=getSum("+",5,6,7);
console.log(s);

在这里插入图片描述
可以用数组简化:

function getArrSum(arg,type){
    
var s=arg[0];
for(var i=1;i<arg.length;i++){
    
    switch(type){
    
        case "+":
        s+=arg[i];
        break;
        case "-":
        s-=arg[i];
        break;
        case "*":
        s*=arg[i];
        break;
        case "/":
        s/=arg[i];
        break;
    }
}
return s;
}

var s=getArrSum([5,6,7],"+");
console.log(s);

在这里插入图片描述

return和break的区别:

break跳出循环,执行函数中循环后的语句
return 跳出函数,直接从循环中跳出函数

function fn1(){
    
    var s=0;
    for(var i=0;i<10;i++){
    
        s+=i;
        if(i===7) return s;
    }
    console.log("aaa");
}

var s=fn1();
console.log(s);

在这里插入图片描述

return限定范围实现开关

点击实现向右运行/停止

var bool=false;
var x=0;
var div1=document.getElementById("div1");
div1.onclick=function(){
    
   bool=!bool;//点击切换true/false
}

setInterval(function(){
    
   if(!bool) return;//true时才执行
   x++;
   div1.style.left=x+"px";
},16);

在这里插入图片描述

return返回结果

单例模式 单独的唯一的实例 起源:

var o;
function fn1(){
    
    return o||(o={
    });
}
var a=fn1();
var b=fn1();
console.log(a==b);

在这里插入图片描述
相当于

var o;
function fn1(){
    
    if(!o) o={
    };
    return o;
}

var a=fn1();
var b=fn1();
console.log(a==b);

在这里插入图片描述
工厂模式 起源:

function fn1(name,age,sex){
    
    return {
    
        name:name,
        age:age,
        sex:sex
    }
}

对象的属性名如果和值的变量名相同,可以直接带入,上面可以简写为:

function fn1(name,age,sex){
    
   return{
    name,age,sex}; //对象的属性名如果和值的变量名相同,可以直接带入
}
var o=fn1("张三",30,"男");
var o1=fn1("李四",20,"女");
console.log(o,o1);

在这里插入图片描述

return返回多个数据

用数组、对象
返回数组:

function fn1(a,b){
    
    a++;
    b*=2;
    return [a,b];
}
    var arr=fn1(1,2);
    console.log(arr);

在这里插入图片描述
返回对象;

function fn1(a,b){
    
    a++;
    b*=2;
    return {
    a,b};
}

var o=fn1(3,5);
console.log(o);

在这里插入图片描述

return返回一个函数: 闭包

函数返回一个函数就是闭包??

返回匿名函数:

function fn1(a){
    
    return function(b){
    
        console.log("aaaa");
    }
}

var f=fn1()
f();

fn1(3)(4);//调用外部再调用内部 两个参数

在这里插入图片描述

return返回函数运行的结果
function fn1(a){
    
    a++;
  return fn2(a);
}

function fn2(a){
    
    a*=2;
   return fn3(a);
}

function fn3(a){
    
    a+=10;
    return a;
}

var s=fn1(5);
console.log(s);

在这里插入图片描述

function fn1(a){
    
    a++;
  return fn2(a)+fn3(a);
}

function fn2(a){
    
    a*=2;
   return a;
}

function fn3(a){
    
    a+=10;
    return a;
}

var s=fn1(5);
console.log(s);
return返回回调函数返回的值
function fn1(a,fn){
    
    a++;
  return fn(a);
}

var s=fn1(5,function(n){
    
    return n*2;
});
console.log(s);

在这里插入图片描述

this

对象中的函数叫方法,是匿名函数

写在对象方法中的this一般指向当前对象(调用时对象已经创建完)

写在对象属性中的this是指向当前上下文环境中this指向(创建此属性时对象未创建完)

之后再详细讲

var a=10;
var obj={
    
    a:1,
    c:this.a,//创建到c时obj未创建完,创建未完成时this无法指向obj,指向window(当前上下文)
    b:function(){
    
        console.log(obj.a);//obj指向变为o指向,obj中不再有a属性
        console.log(this.a);//当前的对象,堆中的,谁指向的无所谓
    }
}

var o=obj;//将obj指向地址给o
obj={
    c:10};//obj指向新地址

o.b();
console.log(o);

在这里插入图片描述

return this

通过return this ,来让对象中的方法可以实现连缀

var obj={
    
  	a:1,
   	run:function(){
    
       console.log("run");
       return this;
   	},
  	 play:function(){
    
       console.log("play");
       return this;
   	}
}

obj.run();
obj.play();

obj.run().play();
obj.play().run();

在这里插入图片描述

回调函数

将函数作为参数传入并调用,被作为参数传入的函数叫做回调函数

将一个函数以参数的形式传入到另一个函数中并且被调用执行

目的就是不关注要执行谁,执行就行了

function fn1(fn){
    
    fn();
}

function fn2(){
    
    console.log("aaa");
}
function fn3(){
    
    console.log("bbb");
}

fn1(fn2);
fn1(fn3);

在这里插入图片描述
通过插入不同的函数,解决不同的问题

function fn1(a,b,fn){
    
    return fn(a,b);
}

function fn2(a,b){
    
    return a+b;
}
function fn3(a,b){
    
    return a-b;
}
function fn4(a,b){
    
    return a*b;
}
function fn5(a,b){
    
    return a/b;
}

var s=fn1(3,5,fn5);
console.log(s);

在这里插入图片描述

function fn1(fn){
    
    for(var i=0;i<10;i++){
    
         fn(i);
     }
}

function fn2(a){
    
    console.log(a);
}

fn1(fn2);

在这里插入图片描述

相当于使用下面匿名函数:

function fn1(fn){
    
    for(var i=0;i<10;i++){
    
        fn(i);
    }
}

fn1(function(a){
    
    console.log(a)
})

在这里插入图片描述

桥接模式 累加 起源:

function fn1() {
    
    var fn = arguments[arguments.length - 1];
    var s = arguments[0];
    for (var i = 1; i < arguments.length - 1; i++) {
    
        s = fn(s, arguments[i]);
    }
    return s;
}

var a = fn1(1, 2, 3, 4, 5, 6, function (s, n) {
    
    return s + n;
})
console.log(a);

var b = fn1(1, 2, 3, 4, 5, 6, function (s, n) {
    
    return s * n;
})
console.log(b);

在这里插入图片描述

setTimeout与setInterval

setInterval()方法重复调用一个函数或执行一个代码段,在每次调用之间具有固定的时间延迟。
语法:
var intervalID = scope.setInterval(func, delay, [arg1, arg2, …]);
在这里插入图片描述

var i=0;
var ids=setInterval(function(a,b,c){
    
    i++;
    console.log(a,b,c);
    if(i>3) clearInterval(ids);
},16,1,2,3);

console.log(ids);

在这里插入图片描述
ids=setInterval(回调函数,间隔时间,参数1,参数2…)

ids就是这个时间间隔 标识id,可以通过clearInterval(ids)解除当前时间间隔设定

回调函数会被在间隔时间达到时调用,参数1,参数2就是向回调函数传参的方式

时间间隔如果设置为0或者不设置,则默认为1毫秒后??还是10?

var i=0;
var ids=setInterval(function(a,b,c){
    
    i++;
    console.log(a,b,c);
    if(i>3) clearInterval(ids);
},16,1,2,3);
console.log(ids);
 
clearInterval(ids);

在这里插入图片描述
瞬间执行完的循环是同步的,而延迟执行的是异步的,在异步执行时,同步时的变量可能早就变化了

var ids;
for(var i=0;i<10;i++){
    
    ids=setInterval(function(){
    
        console.log(i)
    },1000)

每秒输出10个10
在这里插入图片描述

将当时的i传进去延时执行

var ids;
for(var i=0;i<10;i++){
    
    ids=setInterval(function(n){
    
        console.log(n)
    },1000,i)//将当时的i传进去延时执行
}

每秒输出一轮0-9
在这里插入图片描述

用setTimeout重构setInterval

function setInterval_1(fn,time){
    
    setTimeout(function(n){
    
        fn(n);
        setInterval_1(fn,time,n);
    },time,arguments[2]);
}


setInterval_1(function(n){
    
    console.log(n);
},1000,5)

在这里插入图片描述

红绿灯案例:

回调地狱:

setTimeout(function () {
    
    console.log("红");
    setTimeout(function () {
    
        console.log("黄");
        setTimeout(function () {
    
            console.log("绿");
        }, 2000)
    }, 2000)
}, 2000);

递归解决:

function fn1(color,time){
    
setTimeout(function(){
    
    console.log(color);
    if(color==="红"){
    
        fn1("黄",time);
    }else if(color==="黄"){
    
        fn1("绿",time);
    }else if(color==="绿"){
    
        fn1("红",time);
    }
},time)
}

fn1("红",1000);

异步回调使用:

function redColor(fn1,fn2){
    
	 var ids=setTimeout(function(){
    
	       console.log("红色")
	       clearTimeout(ids);
	       fn1(fn2,redColor);
	   },2000);
}

function yellowColor(fn1,fn2){
    
    var ids=setTimeout(function(){
    
        console.log("黄色")
        clearTimeout(ids);
        fn1(fn2,yellowColor);
    },2000);
}

function greenColor(fn1,fn2){
    
    var ids=setTimeout(function(){
    
        console.log("绿色")
        clearTimeout(ids);
        fn1(fn2,greenColor);
    },2000);
}

redColor(yellowColor,greenColor);

在这里插入图片描述
之后还有更简单的方法

礼拜一再讲

回调循环
function fn1(fn,n){
    
	if(n===undefined) n=0;
	n++;
	return fn(fn1,n);
}

function fn2(fn,n){
    
    n++;
    if(n===10) return n;
    return fn(fn2,n);
}

var s=fn1(fn2);
console.log(s);//10

在这里插入图片描述

递归函数

函数自己调用自己

命名函数递归

通过函数名调用

匿名函数递归

通过匿名函数内部arguments实现
在这里插入图片描述
重构map 之后讲
原型 this 回调
在这里插入图片描述

下周讲
递归
数组 方法重构全讲2天

周三开始
内建对象1

周四周五
DOM BOM 2

快的话
讲事件2 ES6 1 正则1
动画
下下周周四开始项目
class面向对象开发

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_46008442/article/details/114999286

智能推荐

android逆向之smali动态调试_app smali 程序入口_爱撒谎的小胖的博客-程序员宅基地

由于工作需要,今天接触了Android逆向。为了完成工作任务作为小白的我开始了smali调试之旅,在网上找了很多文章都没有实现,经过不断地尝试不断地搜索同类型的博客终于实现了,下面是调试过程。android反编译详情见这位老哥的文章:https://blog.csdn.net/jiangguangchao/article/details/85158500环境准备:​ 1、安装Android Sdk、Android Studio、Android Killer、雷电模拟器、adb工具​ 2、将sma._app smali 程序入口

[单片机框架][os层] freertos 中间件 公共函数-程序员宅基地

重新封装freertos函数,以便适配RTX4 /RTX5 / FREERTOS_NRF_RTC。FreeRTOS 是一类 RTOS,设计得足够小以在微控制器上运行——尽管它的使用不限于微控制器应用。微控制器是一种小型且资源受限的处理器,它在单个芯片上集成了处理器本身、只读存储器(ROM 或闪存)以保存要执行的程序,以及程序所需的随机存取存储器 (RAM)执行。通常,程序直接从只读存储器中执行。微控制器用于深度嵌入式应用程序(那些您从未真正看到处理器本身或其运行的软件的应用程序),这些应用程序通常

省考计算机还考xp吗,职称计算机考试XP“退休”仍为考试内容遭吐槽-程序员宅基地

今年北京地区的第二次全国专业技术人员计算机应用能力考试(以下称职称计算机考试)将于4月19日到23日开考,“中文WindowsXP操作系统”也作为考试内容之一出现其中。但事实上,微软早在去年就已宣布,WindowsXP系统将于今年4月8日“退休”。为何一个即将退休的操作系统仍会出现在职称计算机考试的考试内容中?这让不少考生纷纷吐槽,职称计算机考试试题过时、形式古板,是在“流于形式”。Windows..._职称计算机还考windows xp吗

ZOrder的使用-程序员宅基地

ZOrder的使用ZOrder 拆开以后就是 Z 及 Order,其意义说明如下:Z:这里是指三度空间中的 Z 座标轴 (注一),而不是指英文字母的第 26 个字母。Order:排列顺序。所以 ZOrder 就是指在 Z 座标轴上的排列顺序!ZOrder 语法如下:object.ZOrder position ------------------------------------_zorder

SQL解决视图问题_sql视图被挡住了-程序员宅基地

好不容易在安装中解决了字符集问题,然而在练习视图这一部分时发现只要牵扯上文字,就会出错!!mmmm,希望下一代SQL能彻底解决这个问题!!!废话不多说,直接看问题:这是怎么回事??我的student表中有女孩纸啊,为什么显示为空啊…归根结底,还是字符集的问题,孩纸,还是在创建数据库的时候改成中文字符集吧…那么我要用韩语什么的,还要改字符集么…答案是…改正后:敲黑板!!create da..._sql视图被挡住了

state_dict_state_dict.keys_Wanderer001的博客-程序员宅基地

torch.nn.Module.state_dict (Python method, in Module)state_dict(destination=None, prefix='', keep_vars=False)[source]返回一个包含整个模型状态的字典。包含参数和现在的缓冲器(例如,运行平均值)。键对应着参数和缓冲器的名字。返回值:包含整个模型的字典。a dictionary containing a whole state of the module例:>&g_state_dict.keys

随便推点

Windows XP + VC 6.0 + WinXP_DDK + DriverStudio 3.2_windows xp ddk-程序员宅基地

Windows XP + VC 6.0 + WinXP_DDK + DriverStudio 3.21·前言开发windows内核驱动程序是一个非常具有挑战性的工作,你得忍耐调试过程中操作系统 不断蓝屏、不断崩溃的噩梦,所以强烈建议你采用虚拟机做开发平台,这样即使把整个系统都搞蹦_windows xp ddk

PyMySQL Evaluation-程序员宅基地

PyMySQL EvaluationThis page will capture issues related to Openstack moving to the PyMySQL driver for MySQL/MariaDB dbapi access.RationaleWhile the MySQL-Python driver is a very mat..._in _do_execute_many v = values % escape(arg, conn) typeerror: not enough arg

jrebel试用申请及eclipse下jrebel安装和配置-程序员宅基地

近期在eclipse下开发时,由于设置多业务和逻辑的后台类编写,以至于频烦的要重启tomcat测试。在网上查了下jrebel支持热部署,在修改类后不用重启tomcat。jrebel好像是要收费,但找到了一个可以申请14天免费码的地址,以后过期再申请吧。一、jrebel试用激活码申请jrebel试用激活码申请地址:http://zeroturnaround.com/blog/free-v_jrebel试用

linux svn仓库备份,SVN仓库备份和迁移基本操作_余木脑袋的博客-程序员宅基地

本文主要是讲 SVN 仓库的全量备份和增量备份,只包括基本操作. 仓库备份svnadmin dump备份方式多样如果版本数过多,dump的过程将非常慢备份耗时,恢复更耗时备份时数据变大,恢复后数据可能会变小仓库下的passwd和authz不会备份全备份在需要备份SVN仓库的服务器上执行如下命令sudo svnadmin dump /path/repository > /path/reposi..._linux svn如何仓库迁移备份

nyoj1011 So Easy[II]-程序员宅基地

So Easy[II]时间限制:1000 ms | 内存限制:65535 KB难度:2描述这是一道基础的计算几何问题(其实这不提示大家也都看的出)。问题描述如下:给你一个N边形。且N边形的点是由顺时针顺序给出,求这个N边形的面积。(3输入输入多组数据。第一行输入一个N。接下来N行每行有两个数a,b表示一个点。0输出输出N变形的面积,最终结果保留两位小数。(不

js 数组原型方法总结-程序员宅基地

MDN web docs:https://developer.mozilla.org...push(ele1,ele2,....,eleX)ele1:必需。添加到数组尾部的第一个元素。ele2:可选。添加到数组尾部的第二个元素。eleX:可选。可添加多个元素。功能:向数组的末尾添加一个或多个元素。会改变原数组的,返回值是改变后的数组...