ES5-4 函数基础与种类、形实参及映射、变量类型

模块编程原则:高内聚,低耦合(重复部分少),让一个模块有强的功能性、高的独立性 → 单一责任制,用函数进行解耦合。

1. 函数命名规则

  1. 不能以数字开头
  2. 可以以字母_$开头
  3. 包含数字
  4. 小驼峰命名法
  • 函数声明一定有函数名,不然报错
// Uncaught SyntaxError: Function statements require a function name
function () {console.log(1)
}
// 函数内 a是局部变量,b var在window上/GO,是全局变量(泄漏)
var a = b = 1 
  • 用表达式、字面量的形式声明函数,test1是会被忽略的。外部不可见,内部可递归
// 用表达式、字面量的形式声明函数,test1是会被忽略的
// test1() 会报错(外部不可见)
var test = function test1() {console.log(1)test1() // 函数内部可以调用,递归
}
// 匿名函数表达式/函数字面量
var test = function () {console.log(1)
}
// 实参少传
function test(a, b, c) {console.log(a, b, c)// 不报错,c是undefined// 预编译时第一步就处理形参 var x = undefined
}
test(1, 2)
// 实参多传
function test(a, b) {console.log(a, b)// 不报错 1 2
}
test(1, 2, 3)
  • 函数内可获取实参和形参的个数
// 函数内可获取实参、形参
function test(a, b) {console.log(arguments)// 实参个数console.log(test.length)// 形参个数
}
  • 实参传了值的,函数内实参可更改 打印出 3 2
  • 理解:实参和形参是映射关系,当形参改变,实参指向的堆空间的对应位置的值也改变了
    在这里插入图片描述
  • 实参未传值的,是无法赋值的,undefined

与其他程序设计语言不同,ECMAScript 不会验证传递给函数的参数个数是否等于函数定义的参数个数。开发者定义的函数都可以接受任意个数的参数(根据 Netscape 的文档,最多可接受 255 个),而不会引发任何错误。任何遗漏的参数都会以 undefined 传递给函数多余的函数将忽略

  • 用 arguments 对象判断传递给函数的参数个数,即可模拟函数重载
// 一个函数,根据传入实参个数的不同,做不同的事
function doAdd() {if(arguments.length == 1) {alert(arguments[0] + 5);} else if(arguments.length == 2) {alert(arguments[0] + arguments[1]);}
}doAdd(10);	//输出 "15"
doAdd(40, 20);	//输出 "60"
  • arguments[1]和形参b不是一个东西,一个存在堆内存、一个存在栈内存,但有映射关系(arguments存的是指针)
    在这里插入图片描述
  • 函数内的return作用:终止和执行
  • 函数内不写return,运行时会自动加上return
  • 递归实现阶乘与斐波那契:找到规律和函数出口(函数return)
function compute(n) {if (n === 1) {return 1} else {return n * compute(n - 1)}
}
console.log('5的阶乘', compute(5))
// value 1 1 2 3 5 8 13 21
// index 1 2 3 4 5 6  7 
function compute(n) {if (n === 0 || n === 1) {return 1} else {return compute(n - 1) + compute(n - 2)}}
console.log('斐波那契第7项', compute(7))

2. ECMAScript补充

  • ECMAScript 的函数实际上是功能完整的对象
  • 在下面的形式中,每个 arg 都是一个参数,最后一个参数是函数主体(要执行的代码)。
  • 这些参数必须是字符串。
  • 由于字符串的关系,这种形式写起来有些困难,但有助于理解函数只不过是一种引用类型,它们的行为与用 Function 类明确创建的函数行为是相同的。(但是typeof函数的返回值是function而不是object
  • 函数名只是指向函数对象的引用值,行为就像其他对象一样。甚至可以使两个变量指向同一个函数(理解函数重载)
  • 所有函数都应看作 Function 类的实例。
  • Function 对象也有与所有对象共享的 valueOf() 方法和 toString() 方法。这两个方法返回的都是函数的源代码 (原始值的基本包装类、对象的toString方法)
var function_name = new Function(arg1, arg2, ..., argN, function_body)
function sayHi(sName, sMessage) {alert("Hello " + sName + sMessage);
}
var sayHi 
= 
new Function("sName", "sMessage", "alert(\"Hello \" + sName + sMessage);");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/251210.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javascript --- 抽象相等

字符串和数字之间的相等比较 var a 42; var b "42";a b; // false a b; // trueES5规范11.9.3.4-5定义如下: (1)如果Type(x)是数字,Type(y)是字符串,则返回 x ToNumber(y) 的结果 (2)如果Type(x)是字符串,Type(x)是数字,则返回 ToNumber(x) y 的结果// 总结…

Spring加载context的几种方法

Spring中的context管理 Spring中IOC容器的初始化: ApplicationContext即是保存bean对象的容器,故容器本身的初始化,就是通过一系列的配置,将ApplicationContext进行初始化。 而配置ApplicationContext大方向上分为了3中&#xff1…

centos 6.5 配置网络

编辑 vi /etc/sysconfig/network-scripts/ifcfg-eth0修改内容 DEVICE"eth0" BOOTPROTO"static" HWADDR"00:50:56:98:06:D0" IPV6INIT"no" MTU"1500" NM_CONTROLLED"no" ONBOOT"yes" TYPE…

ES5-5 参数默认值、递归、预编译、暗示全局变量

1. 参数默认值 默认是undefined形参可以有默认值,形参、实参哪个有值取哪个ES6,默认值属于ES6的内容,打印出的是符合人性化的结果形参有默认值,形参、实参无法统一、无论实参传入有值还是undefined(代码表现&#xff…

javascript --- 优先级执行顺序

优先级网址 优先级: a && b || c ? c || b ? a : c && b :a// 从优先级网址可以看出 // &&的优先级为:6 // ||的优先级为:5 // ...?...:...的优先级为:4 所以上面的执行顺序为(括号的优先级最高为20): ((a && b) || c) ? (c || b) ?…

CodeForces 1009B(思路)

本来打算打打cf找找自信的&#xff0c;结果&#xff0c;死在了一个2000多人都做出来的B上&#xff0c;写了170多行wr在t4&#xff0c;大佬十几行代码就过了&#xff0c;难受啊。 #include <iostream> #include <cstring> #include <algorithm> #include <…

Delphi及C++Builder经典图书一览表(持续更新中2018.01.02)

序号书名原版书名作者译者出版社页数年代定价备注1CBuilder 5程序设计大全CBuilder 5 Developer’s GuideJarrod Hollingworth康向东、汪浩、黄金才等机械工业出版社13932002.1138.00元2CBuilder应用开发大全Borland C Builder 3 UnleashedCharlie Calvert,et al.徐科、冯焱、吕…

javascript --- 非交互、交互、协作、任务

非交互: var res {};function foo(results) {res.foo results; }function bar(results) {res.bar results; }ajax( "http://some.url.1", foo); ajax( "http://some.url.2", bar);// foo和bar彼此不相关,谁先执行都无所谓..不影响执行结果交互: // 交…

ES5-6 作用域、作用域链、预编译、闭包基础

1. 作用域 上一级在执行时&#xff0c;内部函数被定义&#xff0c;内部函数便生成作用域和作用域链&#xff08;拿上一级的环境&#xff09;&#xff0c;内部函数执行前生成自己的AO&#xff0c;并排在头部函数执行结束时&#xff0c;AO被销毁&#xff08;回到被定义时的状态&…

electron 项目的搭建方式,借助 node 和 npm

1&#xff0c;首先确定安装了 node 和 npm 2&#xff0c;创建一个文件夹&#xff0c;如 aa 3&#xff0c;CMD 命令进入到 aa&#xff0c;用 npm 命令初始化一个项目 4&#xff0c; npm -init 根据提示完成配置 5&#xff0c;安装 electron > npm i -D electronlatest, 这一…

zbb20171215 git 版本回退

1. 使用git log命令查看所有的历史版本&#xff0c;获取某个历史版本的id&#xff0c;假设查到历史版本的id是139dcfaa558e3276b30b6b2e5cbbb9c00bbdca96。 2. git reset --hard 139dcfaa558e3276b30b6b2e5cbbb9c00bbdca96 3. 把修改推到远程服务器 git push -f -u origin ma…

ES5-7 立即执行函数、闭包深入、逗号运算符

1. 立即执行函数 定义在全局的函数只有关闭浏览器或者退出程序才会释放IIFE: Immediately-Invoked Function Expression解决页面加载自动执行&#xff0c;执行完成后立即释放&#xff08;避免了只会执行一次的内容一直存在于全局&#xff09;IIFE用匿名函数或者函数声明&#…

es6 --- 解构赋值的简洁性

设想你有一个工具foo,它可以异步产生两个值(x和y): function getY(x) {return new Promise( function(resolve, reject) {setTimeout( function() {resolve( (3*x) -1 );}, 100);}); }function foo(bar, baz) {var x bar * baz;return getY(x).then( function(y){return [x, …

redis安装(linux)

一、redis安装步骤 1、yum install gcc 如果你机器已经安装了编译环境请忽略&#xff0c;否则在使用make编译源码时会报错。 报错信息&#xff1a;make: *** [adlist.o] 2、使用wget命令下载包  wget http://download.redis.io/releases/redis-4.0.6.tar.gz 3、解压tar包 tar…

验证码何时可以退出历史舞台?

验证码是有必要存在的&#xff0c;只是不同阶段表现形式不同&#xff0c;未来的趋势是更加智能无感知&#xff0c;用户体验更好。 简而言之&#xff0c; 验证码其终极目的&#xff0c;就是区分正常人和机器的操作。区分人机行为是必要的&#xff1a;互联网上各种行为&#xff0…

ES5-8 闭包高级、对象、构造函数、实例化

1. 对象 对象内定义的函数一般称之为方法&#xff0c;在外部的函数声明称为函数对象删除属性使用delete 关键字 var obj {a: 1,b: string } console.log(obj, obj) // {a: 1, b: "string"} delete obj.b console.log(obj, obj) // {a: 1}在对象里&#xff0c;this…

es6 --- 使用生成器交替执行

考虑以下场景: var a 1; var b 2;function foo(){a;b b * a;a b 3; }function bar(){b--;a 8 b;b a * 2; }foo(); bar(); console.log(a, b); // 11 22bar(); foo(); console.log(a, b); // 183 180对于上面的两个函数foo和bar,它们中的任何一个,一旦开始了就会…

oracle-group by -having

1、GROUP BY 语句用于结合合计函数&#xff0c;根据一个或多个列对结果集进行分组。(也就是说group by 和聚合函数结合起来使用&#xff0c;要查询的结果来没有聚合函数则报错&#xff1a;不是group by 表达式) a、where 不能放在group by 后面使用 b、having 要和group by 连在…

【转载】汇编速查手册

一、数据传输指令 ─────────────────────────────────────── 它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. 1. 通用数据传送指令. MOV 传送字或字节. MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. PUSH 把字压…

ES5-9 【utils】构造函数及实例化原理、包装类

1. 构造函数 调用构造函数实际会经历4步 1 创建一个新对象 2 将构造函数的作用域赋值给对象&#xff08;因此this就指向了这个对象&#xff09; 3 执行构造函数中的代码&#xff08;为这个新对象添加属性&#xff09; 4 返回新对象 在构造函数内部&#xff0c;this指向构造函数…