今天学习了函数返回值return、作用域以及预解析,发现预解析这一块还是有丶深奥的。
一、return函数返回值
-
规则介绍:
1、这个返回值是function函数默认自带的,可以使用也可以不使用
2、用于外界和函数内部进行沟通的一个"桥梁"
3、函数内部可以访问函数外部的东西
4、函数外部是访问不了函数内部的,这是函数的规则 — 作用域
5、函数这种规则的作用是为了防止数据相互间覆盖和命名污染问题 -
return使用:
1、可以让外部的访问函数内部的数据,外部可以通过函数名加括号的形式接收 fn();
2、当函数没有返回值的时候,外界接收到的就是undefined
3、return可以终止函数的执行,return后面的代码不会执行
4、函数的返回值可以返回任意数据类型
5、注意:外界拿到的是return后面的数据 return 数据 == 函数名()
二、作用域
- 域,表示的就是范围,区域。例如:两个国家之间有边界线
- 作用域和函数以及变量有关系
- 函数作用域分为全局作用域和局部作用域
1、全局作用域,一个变量在整个script(js文件)标记里面都可以使用,函数外部能使用
2、局部作用域,只能在函数内部使用 - 变量作用域,分为全局和局部
1、在函数外部声明的变量称之为全局变量
2、在函数内部声明的变量称之为局部变量
声明变量问题:
- js语言要求我们声明变量时必须使用var关键字
- js里面如果不使用var声明变量,直接写的变量其实也可以使用,把这种问题称之为bug
- 注意:在函数内部声明的变量如果没有使用var关键字,这个变量就属于全局变量
作用域链:
- 作用域链是作用域访问的规则,规定了如何去查找或者叫做访问一些其他域里面的数据
- 作用域链把作用域划分成了几个不同的 ‘等级’
- 把全局作用域称之为最高的等级,专业术语叫做0级作用域,把函数内部的作用域称之为1级作用域
- 如果遇到函数嵌套函数的情况,外层的函数是1级作用域,其他函数以此类推,分别是2级、3级…
- 作用域链其实就是把所有的作用域链接了起来,方便彼此之间进行访问
- 访问规则:
1、访问数据时先在自己的作用域查找如果有就直接使用,如果没有就上一级继续查找,有就使用上一级
2、如果上一级没有就需要往上查找,直到找到0级作用域还是没有就报错
变量的生命周期:
- JavaScript 变量生命周期在它声明时初始化
- 局部变量在函数执行完毕后销毁
- 全局变量在页面关闭后销毁
三、预解析
- 浏览器不会直接执行代码,当js引擎执行代码时,会分为两部分,预解析和逐行执行
- 预解析就是浏览器加工处理代码的过程
- 预解析规则:
1、变量和函数声明提升,代码执行会把声明提升到当前作用域的最顶端
2、按着代码原先顺序,逐行执行代码
3、把一个函数赋值给变量(var声明的), 函数声明不会提升
简单的小练习
var a = 3;
function fn(){
var b = 4;
alert(a);
alert(b);
function me(){
alert(b);
}
me();
}
fn();
alert(a);
/*
0级作用域预解析:
var a;
function fn(){
var b = 4;
alert(a);
alert(b);
function me(){
alert(b);
}
me();
}
a = 3;
fn();
alert(a);
1级作用域预解析:
var a;
function fn(){
var b;
function me(){
alert(b);
}
b = 4;
alert(a); //3
alert(b); //4
me(); //4
}
a = 3;
fn();
alert(a); //3
*/
四、JS的编译和执行
- 先检查语法错误——语法错误,当前代码不执行
- 声明提升——变量提升和函数提升,作用域所有使用var声明的变量和非匿名函数
- 开始编译——逐行执行