js函数和变量的声明与执行顺序

一、函数执行顺序

1、正常顺序

1     function f(){2 alert(2);3 }4 f(); //alert 2

所有浏览器都能测试通过。

2、倒序调用

1      f(); //alert 22 function f(){3 alert(2);4 }

之前一些浏览器会报undefined,不过,目前的版本大多都可以了

3、含参函数倒序

1 f(2); //alert 2

2 functionf(a){3 alert(a);4 }

目前主流浏览器一样可以正常测试通过

4、声明式函数和赋值式函数

1 f(); //2

2 function f() { // 声明式函数

3 console.log(2);4 }5 f1(); // Uncaught TypeError: f1 is not a function

6 var f1 = function () { // 赋值式函数

7 console.log(2);8 }

声明式函数与赋值式函数的区别在于:在JS的预编译期,声明式函数将会先被提取出来,然后才按顺序执行js代码。

二、变量执行顺序

1、正常顺序

1 var a =2;2 alert(a); //alert 2

2、倒序使用变量

1 alert(a); //alert undefined

2 var a =2;

在变量未定义之前使用,会返回undefined。

3、局部变量的执行

*注意:js中全局var声明的为全局变量  函数体内var声明为局部变量(函数外部访问不到)但是,函数体内未用var声明的为全局变量(函数外部可以使用)

1 functionf(){2 alert(a);3 a = 3;4 }5 f(); //error: a is not defined

这里Firefox的控制台中会报错ReferenceError(引用错误):a 未被定义。。。。所以建议函数体内最好用var声明变量,保持局部性 如:

1 functionf(){2 alert(a);3 vara = 3;4 }5 f(); //undefined

这里alert语句可以弹出,虽然是undefined ,但是没有报错,这是为什么呢??

事实上,JS的解析过程分为两个阶段:预编译期(预处理)与执行期。

预编译期JS会对本代码块中的所有var声明的变量和函数进行处理(类似与C语言的编译),但需要注意的是此时处理函数的只是声明式函数,而且变量也只是进行了声明但未进行初始化以及赋值。

执行期会按照代码块的顺序逐行执行。。

*函数内部 再次声明赋值,函数f()内有局部变量a时,会优先使用自己的变量,只不过第一次alert时未赋值

1 var a = 1;2 functionf(){3 alert(a);4 var a = 3;5 alert(a);6 }7

8 f(); //undefined 和 3

*函数内部 再次全局声明,会修改全局的a

1 var a = 1;2 functionf(){3 alert(a);4 a = 2;5 alert(a);6 }7 f(); //1 和 2

*函数内全局赋值一次,var声明一次    函数f()内还是会优先使用自己的变量a

var a = 1; //函数f()内变量a的执行顺序

functionf(){

alert(a);

a= 2; //#2

alert(a);var a = 3; //等价于 var a ; #1

//a = 3 ; #3

alert(a);

}

f();//undefined 2 和 3

alert(a); //1

函数f()内 变量a 声明与赋值 的执行顺序如上,应该很明确了!!

*一个经典的例子复习一下:

1 vara,b;2 (function(){3 alert(a); //undefined

4 alert(b); //undefined

5 var a=b=3; //等价于 var a = 3 ; b = 3; b是全局的

6 alert(a); //3

7 alert(b); //3

8 })();9 alert(a); //undefined

10 alert(b); //3

三、总结

1、JS的解析过程分为两个阶段:预编译期(预处理)与执行期。

预编译期 JS会对本代码块(两个script块互不影响)中的所有var声明的变量和函数进行处理(类似与C语言的编译)

此时处理函数的只是声明式函数,而且变量也只是进行了声明但未进行初始化以及赋值。

执行期 会按照代码块的顺序筑行执行

2、把执行方法写在函数定义之前是不太规范的,但这个界限被弱化了。如今在一个作用范围之内,都可以被正常调用。

所以,建议和优化如下:

1.函数体内变量最好var声明为局部,保持安全性和局部性。

2.所有变量的声明最好一次性写在作用域的顶端,函数不必需如此,如:

1 functionf(){2 vara, b, c;3

4 a = "abc";5 b = [1,3,1];6 c = 12;7 }

3.函数的执行方法 最好在 函数的定义 之后

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

var和function谁先优先执行_js函数和变量的执行顺序【易错】相关推荐

  1. var和function谁先优先执行_变量var声明和函数function声明优先级

    变量声明优先级 使用var关键字和function关键字声明的变量,会被JS的解释器优先解析执行,具有优先级 使用var关键字声明变量 1. 看代码说话 // 在script中直接打印输出变量a co ...

  2. var和function谁先优先执行_浅谈JavaScript 的执行顺序

    JavaScript是一种描述型脚本语言,它不同于java或C#等编译性语言,它不需要进行编译成中间语言,而是由浏览器进行动态地解析与执行.如果你不能理解javaScript语言的运行机制,或者简单地 ...

  3. var和function谁先优先执行_JS中如何和让异步函数优先执行?

    代码如下: function fun(){ var flag = false; setTimeout(function(){ flag = true; },1000) return flag; } 比 ...

  4. c 执行oracle 函数,Oracle 下医嘱执行函数

    //*********************************************************************** //函数名称:of_zy_yzfy for n_me ...

  5. 期货股票自动交易下单接口怎么执行策略函数?

    像期货股票自动交易下单接口的策略类,其中就包括开仓.买入.止盈.止损方法与策略执行主函数等,那么执行这些策略函数呢? (1)进行期货策略类输入 class StockStrategy:     df ...

  6. js var是什么类型_JS变量的执行环境和生命周期

    温故而知新,这些JS基础知识你都知道吗? 今天和大家分享的是 JavaScript 中有关变量的知识,希望这篇文章能让你对JS中的变量有新的认识. 目录: 变量的执行环境(执行上下文) 执行上下文的生 ...

  7. js变量后面加问号是什么_js没那么简单(1)-- 执行上下文

    前言 我为什么写这个文章?也许换个耳熟能详的话题会有更多人看吧.之前发了个tls感觉阅读量不行. 要讲ecma语法吗?我觉得还是不了吧,毕竟这些繁琐,枯燥,而且门槛低. 那讲什么好?讲一点我自己觉得大 ...

  8. js for循环_JS 函数的执行时机(深入理解6个6)

    定时器:setTimeout() setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式 提示: 1000 毫秒= 1 秒. 提示: 如果你只想重复执行可以使用 setInterval ...

  9. js 异步执行_js执行过程你了解多少?

    来公众号:「九零后重庆崽儿」找我,一起学前端. 本文首发在: js执行过程你了解多少? - 重庆崽儿brand的个人主页​www.brandhuang.com 文章自己整理自网络,如有问题欢迎在知乎或 ...

最新文章

  1. POJ1258 Agri-Net【最小生成树】
  2. 数学之美 系列十五 繁与简 自然语言处理的几位精英
  3. Linux的Nginx四:功能|模块
  4. java中log4j的详解(转)
  5. scrapy 解析css,Scrapy基础(六)————Scrapy爬取伯乐在线一通过css和xpath解析文章字段...
  6. 廖雪峰Java10加密与安全-4加密算法-5非对称加密算法
  7. jdk1.6 改 jdk1.7或jdk1.8(改回也可以)(图文详解)
  8. linux c++开发_Linux/Windows下进行C/C++开发的差异
  9. CentOS6.5和RedHat6.5下以rpm方式安装mysql-5.6.20
  10. 放鞭炮时,应该戴护目镜
  11. rslogix5000pide实例_用RSLogix5000梯形图实现一种高级PID运算
  12. 职业学校计算机教学,职业学校计算机专业教学初探
  13. matlab besselh,关于用matlab求bessel函数零点
  14. 1.按钮点击的四种方式
  15. 文件下载之断点续传(客户端与服务端的实现)
  16. alsa buffer原理_ALSA driver--HW Buffer
  17. 2010不断创新的供应链应用模式
  18. 深入浅出正则表达式(一)(zzl)
  19. 如何让电脑同时连接内外网?
  20. 马云接班人为什么是张勇?

热门文章

  1. python docker库
  2. css3-background clip 和background origin
  3. hadoop2.7.3+spark2.1.0+scala2.12.1环境搭建(4)SPARK 安装
  4. 原来 JS 也支持跟 Lua 语意一样的内嵌函数的闭包概念
  5. 案例:演示使用beantuils的setProperty()、getProperty()和populate()方法访问JavaBean的属性
  6. spring boot http status 400_kubernetes configmap 热更新spring-boot应用
  7. 富文本框让最大四百像素_富文本框的使用
  8. kde重启_重启崩溃的 KDE
  9. 计算机ppt试题训练,powerpoint2010操作题 计算机POWERPOINT操作题
  10. 如何将两部手机内容互换_两部iPhone手机之间如何大量互传照片?