函数和变量的执行顺序
来源:互联网 发布:mac怎么打大写字母 编辑:程序博客网 时间:2024/05/21 15:04
函数的执行顺序
首先确定一点,函数有两种定义方式:
1 声明式函数
function func(){ // code here}
2 赋值式函数
var func = function(){ // code here}
二者的区别在于,声明式函数会在JS的预编译期被先提取出来,然后才按顺序执行JS代码。
(计算机在开始执行语句之前,会先查找所有的function定义,然后保存相关的function。)
变量提前
JS中会将一个作用与内的函数变量的声明提前到当前作用域的最开始,表明这个变量在这个作用域的存在,然后再按顺序执行,执行到赋值语句时进行赋值。
var i=10; function a() { alert(i); var i = 2; }; a();
所以上述例子的结果是undefined,因为上面的代码也相当于:
var i=10; function a() { var i; alert(i); i = 2; }; a();
在函数作用于内定义了i,但是执行alert时并没有赋值,所以是undefined。
赋值式函数也按照这样的顺序去执行。
但是声明式函数会被提前在JS预编译阶段被解析,也就相当于声明与赋值(函数定义)同时在最开始阶段执行了。
所以对于声明式函数:
func(5);function func(i){ console.log(i)}
相当于:
function func(i){ console.log(i)}func(5);
所以结果是5
但是对于赋值式函数就不同了:
func(5);var func = function(i){ console.log(i)}
结果报错,“func is not a function”,原因是上面的代码相当于:
var func;func(5);func = function(i){ console.log(i)}
变量声明提前,但是赋值(也就是定义函数)在后,所以在执行func(5)时,func根本就是undefined
说明
事实上,JS的解析过程分为两个阶段:预编译期(预处理)与执行期。
预编译期JS会对本代码块中的所有var声明的变量和函数进行处理(类似与C语言的编译),但需要注意的是此时处理函数的只是声明式函数,而且变量也只是进行了声明但未进行初始化以及赋值。
执行期 会按照代码块的顺序逐行执行。
建议
- 函数体内变量最好var声明为局部,保持安全性和局部性。
- 所有变量的声明最好一次性写在作用域的顶端,函数不必需如此
- 函数的执行方法 最好在 函数的定义之后
参考
- http://blog.csdn.net/bright_mmmmmmmmmmmm/article/details/51692682
- http://blog.csdn.net/beijiguangyong/article/details/8301707
- http://www.cnblogs.com/highshao/p/5442460.html
0 0
- 函数和变量的执行顺序
- java构造函数和静态变量的执行顺序
- Java静态变量和构造函数的执行顺序
- Java静态变量和构造函数的执行顺序
- java构造函数和静态变量的执行顺序
- 成员变量和构造函数执行顺序
- 成员变量和构造函数执行顺序
- C#中基类和派生类的构造函数以及变量的执行顺序整理
- C#中基类和派生类的构造函数以及变量的执行顺序整理
- java构造函数和静态变量的执行顺序(实例一)
- java变量,初始化快,构造函数的执行顺序
- java变量,初始化快,构造函数的执行顺序
- java变量,初始化快,构造函数的执行顺序 .
- java变量,初始化快,构造函数的执行顺序
- java变量,初始化快,构造函数的执行顺序
- java变量,初始化快,构造函数的执行顺序
- 子类、父类、静态成员变量,构造函数的执行顺序
- java变量,初始化快,构造函数的执行顺序
- Java实现HTML代码生成PDF文档
- java中对数组操作的一些特殊方法
- 读AsyncTask源码之浅析
- SOA 之路 -- Spring Cloud配置文件的统一管理
- Qt之pro配置详解
- 函数和变量的执行顺序
- Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现
- SDNU 1094.Clock 时针分针角度
- 数学中空间的含义
- An Energy-Efficient Ant-Based Routing Algorithm for Wireless Sensor Networks (无线传感网中一种基于蚁群算法的能量有效路由)
- Discuz!应用中心安装插件显示数据下载错误(105/102)的解决方法
- 各种 Python 库/模块/工具
- Matlab中的随机函数
- Mongdb基本操作符