标签:
前言
因为前一段时间经人推荐去看了周爱民老师关于js引擎解析的视频,里面有关于js引擎是如何解析javascript语句的讲解,推荐有需要的朋友可以去看一下。其中有一段是在讲解关于函数声明和运算的例子:
下面三个式子分别代表什么意思,会执行什么:
1. function () {
}();
2. function () {
}(1);
3.( function () {
})(1);
答案是:
1. 会显示语法错误
原因:此语句会分开两部分解析;首先会将function(){}作为函数声明处理,不会有任何返回值。处理完后进行括号运算符操作,因为运算符里没有运算元,所以报语法错误。
2. 会显示1
原因:此语句也是会分两部分解析;首先会将函数funciton(){}作为函数声明处理,不会有任何返回值。处理过后,再进行括号运算符操作,因为运算符内有个数字1,因此直接输出1这个数字。
3. 会将括号内的1作为参数传递进匿名函数中执行
原因:此语句也是会分两部分执行;首先第一个圆括号作为运算符,里面的函数作为运算元会返回一个函数;因为前一个返回的是一个函数,因此函数后面跟着的这个括号可以视作为函数执行语句,而里面的参数1则作为函数的形参传递。
之所以会想把这个例子放在这里,是因为我之前并没有仔细的研究过这个问题,现在看到了就记录下来。
由此可以看到函数声明的形式是:
function A() { ... }
函数表达式的形式是:
var A = function () {};
两者的异同或者说解析方式的异同:
1. 函数声明和函数表达式都会涉及到变量声明提升
变量声明提升即:当浏览器对js进行解析的时候,都会先将函数声明或变量声明做一个预处理,即把它们提前到当前函数的最开头进行定义。
因为函数表达式在js解析的时候是分两步进行执行的,第一步将变量进行声明,第二步对变量赋值。因此在执行第一步的时候会涉及到变量声明提升。
2. 函数声明是全部函数体提前;函数表达式是只对变量本身提前,函数体会在执行的时候再赋值。
举例说明:
var getName = function () { alert (1);}; function getName() { alert (2);}
getName();//问此处会执行什么?
在js解析的时候实际是这样的:
var getName ; function getName() { alert (2);} getName = function () { alert (1);};
因此getName()会返回1,因为函数声明提前了,因此,在最后执行期间赋值操作遍成为最后定义getName的方法,和最开始定义函数的顺序不太一致。
标签:
原文地址:http://www.cnblogs.com/Candybunny/p/5406475.html