千锋教育JavaScript全套视频教程(10天学会Js,前端javascrip

函数--function
声明式函数
声明式函数在函数定义之前 可以 调用
console.log(fn1); // ƒ fn1(){console.log('定义了一个声明式函数fn1,这是fn1函数内部');}
fn1();
赋值式函数
赋值式函数在函数赋值给变量之前 无法调用,如果调用会报错
因为赋值式函数是将函数赋值给了一个变量,而变量在声明之前访问结果是undefined
所以在将函数赋值给变量之前,这个变量的值是undefined,不是函数,所以无法调用
函数
函数 是一段有名字的代码块,完成特定功能的代码块
函数可以减少代码冗余,方便维护开发
特点:一次定义,多次使用
函数的四要素
函数名 --- 函数的命名规则 同 变量的命名规则
函数体
函数的参数
// 形参 --- 形式参数
// 实参 --- 实际参数
// 返回值
// 注意:
// 函数如果不调用,内部的代码不会执行,只有调用函数,内部代码才会自行
函数的定义
声明式函数 --- 普通函数
通过function关键字定义函数,并且给函数起名
function 函数名(){
函数体
}
// 函数的返回值 return
// 在函数内部声明的变量在函数外部访问不到,只能在函数内部访问
// 如果我们需要在函数外部使用函数内部所产生的值,如果使用
// 就可以利用 函数的返回值 实现
// 函数执行完之后必须有一个结果,这个结果叫做:返回值。
// 使用 return 关键字来执行函数的返回值。
// 在函数内部 return 关键字 后面跟的什么那么这个函数的返回值就是什么
// return 关键字
// return 关键字 除了可以返回值以外还要一个作用
// 会 终止函数的执行
// 在函数内部 只要执行了 return 那么这个函数就会停止执行,
// 即使后面还有代码也不会再执行了
// 如果在函数内部没有 return 或者 return后面没有值,函数的返回值就是 undefined
变量和函数
预解析-变量和函数的提升
01js运行的代码分为三个阶段
预编译
// 检查代码是否存在语法上的错误
// 浏览器帮我们做,所做的事情就是基本的语法检查,
// 除了给我们报错时,看不见摸不着
预解析
// 浏览器帮我们做,所做的事情就是变量和函数的提升,
// 对我们程序中使用var声明的变量和使用function定义的函数进行预解析(提升)工作。
执行阶段
// 从上往下逐行执行js代码
// 注意:
// 对于函数在没有调用执行时是不会进入函数内部的
// 只有在函数被调用执行时才会进入函数内部
// 对函数内部的进行 预编译---预解析---执行阶段
02变量的提升
js会针对所有使用 var关键字声明的变量进行提升,提升到当前作用域的最顶端
针对变量的提升,只会提升声明部分,不会提升赋值部分
// 因为变量声明了没有赋值,结果就是undefined,所以在赋值之前访问结果都是undefined
变量名和函数名重名时候如何执行
// 当 变量名 和 函数名 重名时
在 提升阶段 函数优先
// 在这个名字的变量声明赋值之前,访问这个名字,访问到的都是函数
在 执行阶段 变量优先
// 在这个名字的变量声明赋值之后,访问这个名字,访问到的都是变量
变量的作用域
// 所谓的变量的作用域就是指变量能够起作用的范围
// 根据变量能够起作用的范围,我们将变量分为 全局变量 和 局部变量
全局变量
// 全局变量的作用域是 全局作用域
// 定义在函数外部,在页面的任何位置都能正常访问的变量
局部变量
// 局部变量的作用域是 局部作用域
// 定义在函数内部,只能在该函数内部访问的变量
全局变量和局部变量重名时
当 全局变量 和 局部变量 重名时
在 函数外部 访问到的是 全局变量,因为局部变量在全局中访问不到
在 函数内部 优先访问到的是 局部变量
// 在 函数内部 优先访问到的是 局部变量
// 如果 函数内部没有这个名字的局部变量,才会访问全局变量
变量的作用域链
访问变量时
首先在自身的作用域中查找,如果有就使用
没有就往外层作用域查找,如果有就使用
没有就继续往外层作用域查找,一直会查到全局作用域
// 当变量赋值没有var时
// 会去在上一个作用域中找【同名&带var】
// 找到了 - 直接修改
// 找不到 - 在作用域链上找
// 一直找到顶级全局作用域
// 找到了 - 直接修改
// 找不到 - 自己创建修改(创建一个全局变量)
递归函数
// 递归 本质上是一种算法,是一种程序调用自身的编程技巧。
特点:函数调用自身
和循环非常类似(重复计算执行)。所以递归也和循环一样,需要一个出口
// 虽然递归和循环很像,但是递归不可以代替循环
// - 性能不如循环
// - 内存占用过高(非常致命)
// - 递归次数必须预期收敛