JS函数与DOM

什么是函数

  • 函数就是语句的封装,可以让这些代码方便地被复用

  • 函数具有“一次定义,多次调用”的优点

  • 使用函数,可以简化问题,让代码更具有可读性

  • 和变量类似,函数必须先定义然后才能使用

  • 使用function关键字定义函数,function是“功能”的意思
    函数的调用

  • 执行函数体中的所有语句,就称为“调用函数”

  • 调用函数非常简单,只需在函数名字后书写圆括号对即可

  • 和变量声明提升类似,函数声明也可以被提升

  • 如果函数是用函数表达式的写法定义的,则没有提升特性

  • 参数是函数内的一些待定值,在调用函数时,必须传入这些

  • 函数的参数可多可少,函数可以没有参数,也可以有多个参数,多个参数之间需要用逗号隔开

  • 函数内arguments表示它接收到的实参列表,它是一个类数组对象

  • 类数组对象:所有属性均为从0开始的自然数序列,并且有length属性,和数组类似可以用方括号书写下标访问对象的某个属性值,但是不能调用数组的方法

  • 函数体内可以使用return关键字表示“函数的返回值”

  • 调用一个有返回值的函数,可以被当做一个普通值,从而可以出现在任何可以书写值的地方

  • 调用函数时,一旦遇见return语句则会立即退出函数,将执行权交还给调用者
    遇见return即退出函数

  • 结合if语句的时候,往往不需要写else分支了

  • 比如题目:请编写一个函数,判断一个数字是否是偶数
    变量作用域

  • JavaScript是函数级作用域编程语言:变量只在其定义时所在的function内部有意义。

  • 如果不将变量定义在任何函数的内部,此时这个变量就是全局变量,它在任何函数内都可以被访问和更改。

  • 如果函数中也定义了和全局同名的变量,则函数内的变量会将全局的变量“遮蔽”

  • 一个函数内部也可以定义一个函数。和局部变量类似,定义在一个函数内部的函数是局函数。

  • 在函数嵌套中,变量会从内到外逐层寻找它的定义。

  • 在初次给变量赋值时,如果没有加var,则将定义全局变量。

什么是闭包

  • JavaScript中函数会产生闭包(closure)。闭包是函数本身和该函数声明时所处的环境状态的组合。
  • 函数能够“记忆住”其定义时所处的环境,即使函数不在其定义的环境中被调用,也能访问定义时所处环境的变量。
  • 在JavaScript中,每次创建函数时都会创建闭包。
  • 但是,闭包特性往往需要将函数“换一个地方”执行,才能被观察出来。
  • 闭包很有用,因为它允许我们将数据与操作该数据的函数关联起来。这与“面向对象编程”有少许相似之处。
  • 闭包的功能:记忆性、模拟私有变量。
  • 当闭包产生时,函数所处环境的状态会始终保持在内存中,不会在外层函数调用后被自动清除。这就是闭包的记忆性。
  • 创建体温检测函数checkTemp(n),可以检查体温n是否正常,函数会返回布尔值。
  • 但是,不同的小区有不同的体温检测标准,比如A小区体温合格线是37.1℃,而B小区体温合格线是37.3℃,应该怎么编程呢?
  • 题目:请定义一个变量a,要求是能保证这个a只能被进行指定操作(如加1、乘2),而不能进行其他操作,应该怎么编程呢?
  • 在Java、C++等语言中,有私有属性的概念,但是JavaScript中只能用闭包来模拟。
  • 不能滥用闭包,否则会造成网页的性能问题,严重时可能导致内存泄露。所谓内存泄漏是指程序中己动态分配的内存由于某种原因未释放或无法释放。
  • 所谓内存泄漏是指程序中己动态分配的内存由于某种原因未释放或无法释放。
function addCount() {
var count = 0;
return function () {
count = count + 1;
console.log(count);
};
}
var fun1 = addCount();
var fun2 = addCount();
fun1();
fun2();
fun2();
fun1();
  • IIFE(Immediately Invoked Function Expression,立即调用函数表达式)是一种特殊的JavaScript函数写法一旦被定义,就立即被调用。
  • 函数不能直接加圆括号被调用。
  • 函数必须转为“函数表达式”才能被调用。
  • 为变量赋值:当给变量赋值需要一些较为复杂的计算时(如if语句),使用IIFE显得语法更紧凑。
  • IIFE可以在一些场合(如for循环中)将全局变量变为局部变量,语法显得紧凑。

算法题

寻找喇叭花数

  • 题目:喇叭花数是这样的三位数:其每一位数字的阶乘之和恰好等于它本身。即abc = a! + b!+ c!,其中abc表示一个三位数。试寻找所有喇叭花数。
  • 思路:将计算某个数字的阶乘封装成函数,这样可以让问题简化

JavaScript内置sort()方法

  • 数组排序可以使用sort()方法,这个方法的参数又是一个函数。
var arr = [33, 22, 55, 11];
arr.sort(function (a, b) {
});
  • 这个函数中的a、b分别表示数组中靠前和靠后的项,如果需要将它们交换位置,则返回任意正数;否则就返回负数
var arr = [33, 22, 55, 11];
arr.sort(function (a, b) {
if (a > b) {
return 1;
} else {
return -1;
}
});

递归

  • 函数的内部语句可以调用这个函数自身,从而发起对函数的一次迭代。在新的迭代中,又会执行调用函数自身的语句,从而又产生一次迭代。当函数执行到某一次时,不再进行新的迭代,函数被一层一层返回,函数被递归。
  • 递归是一种较为高级的编程技巧,它把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
  • 边界条件:确定递归到何时终止,也称为递归出口
  • 递归模式:大问题是如何分解为小问题的,也称为递归体
    浅克隆
  • 使用var arr2 = arr1这样的语句不能实现数组的克隆
  • 浅克隆:准备一个空的结果数组,然后使用for循环遍历原数组,将遍历到的项都推入结果数组
  • 浅克隆只克隆数组的一层,如果数组是多维数组,则克隆的项会“藕断丝连”。

实现深克隆

  • 使用递归思想,整体思路和浅克隆类似,但稍微进行一些改动:如果遍历到项是基本类型值,则直接推入结果数组;如果遍历到的项是又是数组,则重复执行浅克隆的操作。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值