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(){ //声明式函数
alert(2);
}
f1();
var f1 = function () { //赋值式函数
alert(2);
}
声明式函数与赋值式函数的区别在于:在JS的预编译期,声明式函数将会先被提取出来,然后才按顺序执行js代码。
二、变量执行顺序
1、正常顺序
var a =2;
alert(a); //alert 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.函数的执行方法 最好在 函数的定义 之后
js函数和变量的声明与执行顺序的更多相关文章
- js函数和变量的执行顺序【易错】
js函数和变量的声明与执行顺序 一.函数执行顺序 1.正常顺序 function f(){ alert(2); } f(); //alert 2 所有浏览器都能测试通过. 2.倒序调用 f(); // ...
- js 函数和变量的提升
js 函数和变量的提升 1. 函数的作用域: js中 ,函数的作用域为函数,而不是大括号. var hei = 123;if(true){ hei = 456;}console.log(hei);// ...
- JS函数和变量
JS函数和变量 函数: 函数是由事件或者当它被调用时执行的可重复使用的代码块. 是一个独立的代码块,实现特定功能模块. 函数他不进行调用触发的话,不会自己主动执行. 像ATM机一样,不去取钱的话不会 ...
- js函数、变量提升(hoisting)
其实我只是想复习下变量提升的,然后看到了函数提升,然后再看到了函数声明.函数表达式. 有必要怀着敬仰之心提及园子里的TOM大叔的解密命名函数表达式,不愧是大叔,好好地脑补了下基础知识. 在ECMASc ...
- JS基础_变量的声明提前、函数的声明提前
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- JS函数、变量作用域
函数参数 函数的()中指定一个或多个形参(形式参数),多个形参之间用,号隔开,声明形参相当于在函数内部声明了对应的变量,但不赋值.在调用时在()中指定实参 调用时解析器不会检查实参类型.数量,实参可 ...
- JS函数和变量名称冲突
在JS中如果函数名与变量名冲突,JS是怎么执行的? <script> console.log(sum);//function sum(){} function sum(){} var su ...
- MIC中函数和变量的声明
c++/c使用 __declspec(target(mic))函数或变量声明 或 __attribute__((target(mic)))函数或变量声明 举例如下: __attribute__((ta ...
- [转]js 判断js函数、变量是否存在
本文转自:http://blog.csdn.net/liang4571231/article/details/4042519 在进行js编程时,总会出现可能一些函数或者变量未定义而被引用,导致报错的情 ...
随机推荐
- ios集成极光推送:Undefined symbols for architecture arm64: "_dns_parse_resource_record", referenced from:?
添加libresolv.tbd库,即可解决问题 Undefined symbols for architecture arm64: "_dns_parse_resource_record&q ...
- GoogLeNet 之 Inception v1 v2 v3 v4
论文地址 Inception V1 :Going Deeper with Convolutions Inception-v2 :Batch Normalization: Accelerating De ...
- bzoj 2721
题解:首先推一发式子(见csdn https://blog.csdn.net/lleozhang/article/details/83415995) 因为x是整数,所以x的数量显然为能使取得整数的t的 ...
- Happiness
1575: Happiness 时间限制: 1 Sec 内存限制: 1280 MB 题目描述 Chicken brother is very happy today, because he atta ...
- Nginx详解十八:Nginx深度学习篇之Rewrite规则
Rewrite规则可以实现对url的重写,以及重定向 作用场景: 1.URL访问跳转,支持开发设计,如页面跳转,兼容性支持,展示效果等 2.SEO优化 3.维护:后台维护.流量转发等 4.安全 配置语 ...
- vue中引入css文件
两种方式引入css文件,一种是直接在main.js中引入(也可以在其他的.vue文件中的<script></script>标签中),即下面这种写法: import 'eleme ...
- C++ Primer 笔记——OOP
1.基类通常都应该定义一个虚析构函数,即使该函数不执行任何实际操作也是如此. 2.任何构造函数之外的非静态函数都可以是虚函数,关键字virtual只能出现在类内部的声明语句之前而不能用于类外部的函数定 ...
- 论文阅读笔记十六:DeconvNet:Learning Deconvolution Network for Semantic Segmentation(ICCV2015)
论文源址:https://arxiv.org/abs/1505.04366 tensorflow代码:https://github.com/fabianbormann/Tensorflow-Decon ...
- Python函数之递归函数
递归函数的定义:在这个函数里再调用这个函数本身 最大递归深度默认是997或者998,python从内存角度做的限制 优点:代码变简单 缺点:占内存 一:推导年龄 问a的值是多少: a 比 b 小2,b ...
- Django Web开发基础环境配置流程
创建虚拟环境 mkvirtualenv django_py3_1.11 -p python3 注意需要联网 安装Django 使用django 1.11.11版本,注意需要联网 pip install ...