var和function谁先优先执行_js函数和变量的执行顺序【易错】
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函数和变量的执行顺序【易错】相关推荐
- var和function谁先优先执行_变量var声明和函数function声明优先级
变量声明优先级 使用var关键字和function关键字声明的变量,会被JS的解释器优先解析执行,具有优先级 使用var关键字声明变量 1. 看代码说话 // 在script中直接打印输出变量a co ...
- var和function谁先优先执行_浅谈JavaScript 的执行顺序
JavaScript是一种描述型脚本语言,它不同于java或C#等编译性语言,它不需要进行编译成中间语言,而是由浏览器进行动态地解析与执行.如果你不能理解javaScript语言的运行机制,或者简单地 ...
- var和function谁先优先执行_JS中如何和让异步函数优先执行?
代码如下: function fun(){ var flag = false; setTimeout(function(){ flag = true; },1000) return flag; } 比 ...
- c 执行oracle 函数,Oracle 下医嘱执行函数
//*********************************************************************** //函数名称:of_zy_yzfy for n_me ...
- 期货股票自动交易下单接口怎么执行策略函数?
像期货股票自动交易下单接口的策略类,其中就包括开仓.买入.止盈.止损方法与策略执行主函数等,那么执行这些策略函数呢? (1)进行期货策略类输入 class StockStrategy: df ...
- js var是什么类型_JS变量的执行环境和生命周期
温故而知新,这些JS基础知识你都知道吗? 今天和大家分享的是 JavaScript 中有关变量的知识,希望这篇文章能让你对JS中的变量有新的认识. 目录: 变量的执行环境(执行上下文) 执行上下文的生 ...
- js变量后面加问号是什么_js没那么简单(1)-- 执行上下文
前言 我为什么写这个文章?也许换个耳熟能详的话题会有更多人看吧.之前发了个tls感觉阅读量不行. 要讲ecma语法吗?我觉得还是不了吧,毕竟这些繁琐,枯燥,而且门槛低. 那讲什么好?讲一点我自己觉得大 ...
- js for循环_JS 函数的执行时机(深入理解6个6)
定时器:setTimeout() setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式 提示: 1000 毫秒= 1 秒. 提示: 如果你只想重复执行可以使用 setInterval ...
- js 异步执行_js执行过程你了解多少?
来公众号:「九零后重庆崽儿」找我,一起学前端. 本文首发在: js执行过程你了解多少? - 重庆崽儿brand的个人主页www.brandhuang.com 文章自己整理自网络,如有问题欢迎在知乎或 ...
最新文章
- POJ1258 Agri-Net【最小生成树】
- 数学之美 系列十五 繁与简 自然语言处理的几位精英
- Linux的Nginx四:功能|模块
- java中log4j的详解(转)
- scrapy 解析css,Scrapy基础(六)————Scrapy爬取伯乐在线一通过css和xpath解析文章字段...
- 廖雪峰Java10加密与安全-4加密算法-5非对称加密算法
- jdk1.6 改 jdk1.7或jdk1.8(改回也可以)(图文详解)
- linux c++开发_Linux/Windows下进行C/C++开发的差异
- CentOS6.5和RedHat6.5下以rpm方式安装mysql-5.6.20
- 放鞭炮时,应该戴护目镜
- rslogix5000pide实例_用RSLogix5000梯形图实现一种高级PID运算
- 职业学校计算机教学,职业学校计算机专业教学初探
- matlab besselh,关于用matlab求bessel函数零点
- 1.按钮点击的四种方式
- 文件下载之断点续传(客户端与服务端的实现)
- alsa buffer原理_ALSA driver--HW Buffer
- 2010不断创新的供应链应用模式
- 深入浅出正则表达式(一)(zzl)
- 如何让电脑同时连接内外网?
- 马云接班人为什么是张勇?
热门文章
- python docker库
- css3-background clip 和background origin
- hadoop2.7.3+spark2.1.0+scala2.12.1环境搭建(4)SPARK 安装
- 原来 JS 也支持跟 Lua 语意一样的内嵌函数的闭包概念
- 案例:演示使用beantuils的setProperty()、getProperty()和populate()方法访问JavaBean的属性
- spring boot http status 400_kubernetes configmap 热更新spring-boot应用
- 富文本框让最大四百像素_富文本框的使用
- kde重启_重启崩溃的 KDE
- 计算机ppt试题训练,powerpoint2010操作题 计算机POWERPOINT操作题
- 如何将两部手机内容互换_两部iPhone手机之间如何大量互传照片?