js函数和变量的执行顺序【易错】
js函数和变量的声明与执行顺序
一、函数执行顺序
1、正常顺序
function f(){
alert(2);
}
f(); //alert 2
所有浏览器都能测试通过。
2、倒序调用
f(); //alert 2
function f(){
alert(2);
}
之前一些浏览器会报undefined,不过,目前的版本大多都可以了
3、含参函数倒序
f(2); //alert 2
function f(a){
alert(a);
}
目前主流浏览器一样可以正常测试通过
4、声明式函数和赋值式函数
f(); //
function f() { // 声明式函数
console.log(2);
}
f1(); // Uncaught TypeError: f1 is not a function
var f1 = function () { // 赋值式函数
console.log(2);
}
声明式函数与赋值式函数的区别在于:在JS的预编译期,声明式函数将会先被提取出来,然后才按顺序执行js代码。
二、变量执行顺序
1、正常顺序
var a =2;
alert(a); //alert 2
2、倒序使用变量
alert(a); //alert undefined
var a =2;
在变量未定义之前使用,会返回undefined。
3、局部变量的执行
*注意:js中全局var声明的为全局变量 函数体内var声明为局部变量(函数外部访问不到)但是,函数体内未用var声明的为全局变量(函数外部可以使用)
function f(){
alert(a);
a = 3;
}
f(); //error: a is not defined
这里Firefox的控制台中会报错ReferenceError(引用错误):a 未被定义。。。。所以建议函数体内最好用var声明变量,保持局部性 如:
function f(){
alert(a);
var a = 3;
}
f(); //undefined
这里alert语句可以弹出,虽然是undefined ,但是没有报错,这是为什么呢??
事实上,JS的解析过程分为两个阶段:预编译期(预处理)与执行期。
预编译期 JS会对本代码块中的所有var声明的变量和函数进行处理(类似与C语言的编译),但需要注意的是此时处理函数的只是声明式函数,而且变量也只是进行了声明但未进行初始化以及赋值。
执行期 会按照代码块的顺序逐行执行。。
*函数内部 再次声明赋值,函数f()内有局部变量a时,会优先使用自己的变量,只不过第一次alert时未赋值
var a = 1;
function f(){
alert(a);
var a = 3;
alert(a);
} f(); //undefined 和 3
*函数内部 再次全局声明,会修改全局的a
var a = 1;
function f(){
alert(a);
a = 2;
alert(a);
}
f(); //1 和 2
*函数内全局赋值一次,var声明一次 函数f()内还是会优先使用自己的变量a
var a = 1; // 函数f()内变量a的执行顺序
function f(){
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 声明与赋值 的执行顺序如上,应该很明确了!!
*一个经典的例子复习一下:
var a,b;
(function(){
alert(a); //undefined
alert(b); //undefined
var a=b=3; //等价于 var a = 3 ; b = 3; b是全局的
alert(a); //
alert(b); //
})();
alert(a); //undefined
alert(b); //
三、总结
1、JS的解析过程分为两个阶段:预编译期(预处理)与执行期。
预编译期 JS会对本代码块(两个script块互不影响)中的所有var声明的变量和函数进行处理(类似与C语言的编译)
此时处理函数的只是声明式函数,而且变量也只是进行了声明但未进行初始化以及赋值。
执行期 会按照代码块的顺序筑行执行
2、把执行方法写在函数定义之前是不太规范的,但这个界限被弱化了。如今在一个作用范围之内,都可以被正常调用。
所以,建议和优化如下:
1.函数体内变量最好var声明为局部,保持安全性和局部性。
2.所有变量的声明最好一次性写在作用域的顶端,函数不必需如此,如:
function f(){
var a, b, c;
a = "abc";
b = [1,3,1];
c = 12;
}
3.函数的执行方法 最好在 函数的定义 之后
作者:没错high少是我
js函数和变量的执行顺序【易错】的更多相关文章
- js 函数和变量的提升
js 函数和变量的提升 1. 函数的作用域: js中 ,函数的作用域为函数,而不是大括号. var hei = 123;if(true){ hei = 456;}console.log(hei);// ...
- JS的预编译和执行顺序 详析
原文:JS的预编译和执行顺序 详析 最近在复习javascript的事件处理时发现了一个问题,然后也是我来写javascript的预编译和执行顺序的问题 代码: 复制代码 代码一 <ht ...
- wex5 实战 wex5与js的组件关系与执行顺序(父子与先后)
初学wex5,先理理让人容易混淆的三个概念: 一 基本概念: 1 wex5组件,顾名思义,在编辑窗口右侧的组件集合里的,都是wex5基于开源自创的组件,并封装了一套自已的方法.目的是为了方便.相关方法 ...
- JS函数和变量
JS函数和变量 函数: 函数是由事件或者当它被调用时执行的可重复使用的代码块. 是一个独立的代码块,实现特定功能模块. 函数他不进行调用触发的话,不会自己主动执行. 像ATM机一样,不去取钱的话不会 ...
- js 关于setTimeout和Promise执行顺序问题
js 关于setTimeout和Promise执行顺序问题 异步 -- Promise和setTimeout 执行顺序 Promise 和 setTimeout 到底谁先执行 定时器的介绍 Jav ...
- js函数和变量的声明与执行顺序
一.函数执行顺序 1.正常顺序 function f(){ alert(2); } f(); //alert 2 所有浏览器都能测试通过. 2.倒序调用 f(); //alert 2 function ...
- jquery和js的几种页面加载函数的方法以及执行顺序
参考博客:http://www.cnblogs.com/itslives-com/p/4646790.html https://www.cnblogs.com/james641/p/783837 ...
- JS的预编译和执行顺序 详析(及全局与局部变量)
最近在复习javascript的事件处理时发现了一个问题,于是总结一下:javascript的预编译和执行顺序的问题: <html> <head> <title> ...
- JS函数和变量名称冲突
在JS中如果函数名与变量名冲突,JS是怎么执行的? <script> console.log(sum);//function sum(){} function sum(){} var su ...
随机推荐
- gridview 横向滚动 一行显示
http://blog.csdn.net/chin3q/article/details/6559345 http://blog.csdn.net/yuzhouxiang/article/details ...
- 在DuiLib中使用MFC类
比如,想在DuiLib里使用MFC中的CInternetSession 首先,将Project Properties->General->Use of MFC设置为Use MFC in a ...
- Mac 操作系统安装 SVN server教程(Subversion With Mac OS X Tutorial)
Find recent articles on my github page: rubyrobot.github.io © 2006-2014 Imagine Ecommerce Subversion ...
- Linux环境下安装ActiveMq
一.准备安装的tar包 1.将安装包放在服务器上:apache-activemq-5.10.2.tar.gz 2.将安装包解压:tar -zxvf apache-activemq-5.10.2.tar ...
- Impala 安装笔记1一Cloudera CDH4.3.0安装
Impala是Cloudera在受到Google的Dremel启发下开发的实时交互SQL大数据查询工具,Impala没有再使用缓慢的Hive+MapReduce批处理,而是通过使用与商用并行关系数据库 ...
- UIAutomator 2
UIAutomator 2 While the API remains almost the same, the internal implementation has changed and we ...
- Javascript高级程序设计笔记(很重要尤其是对象的设计模式与继承)
var obj = {'a':'a'}; var fun = function (){} console.log(typeof obj);//object console.log(typeof fun ...
- Codeforces696 Round #362 (Div. 1)(vp) A~D题解
很久没有打比赛了,内部模拟赛天天垫底,第一次vp之旅又是和**一样,这样下去GDOI之后直接退役算了 整场都在忘开LL A. Lorenzo Von Matterhorn 这个题一看我就想直接虚树+树 ...
- AutoItLibrary安装和常见问题解决
http://blog.csdn.net/bible_reader/article/details/52044345
- linux系统配置之服务程序的开机自启动(centos)
CentOS安装好apache.mysql等服务器程序后,并没有设置成开机自动启动的,为避免重启后还要手动开启web等服务器,还是做下设置好,其实设置很简单,用chkconfig命令就行了. 例如,要 ...