关于javascript中的函数: 
  1、预解析:把所有的函数定义提前,所有的变量声明提前,变量的赋值不提前 
  2、执行 :从上到下执行,但有例外(setTimeout,setInterval,ajax中的回调函数,事件中的函数需要触发执行)

函数的参数可以是一个函数,这个函数可以直接调用

  函数可以作为返回值 
  函数的嵌套形成闭包 
function有双重身份: 
  1、对象 
  2、构造函数

一、定义

预解析:在当前作用域下,js运行之前,会把带有varfunction关键字的事先声明,并在内存中安排好。然后再从上到下执行js语句。

预解析只会发生在通过var定义的变量和function上。

1、 var

通过var关键字定义的变量进行预解析的时候:都是声明declare,不管它有没有赋值,都会赋值undefined

alert(a); //undefined
var a = 1;
alert(b); //undefined
var b = function(){
}
alert(c); //undefined
var c;
只要是通过var定义的,不管是变量,还是函数,都是先赋值undefined,如果是变量,也不管变量有没有赋值,在预解析阶段都是会被赋值为undefined

2、 function

function进行预解析的时候,不仅是声明而且还定义(define)了,但是它存储的数据的那个空间里面存储的是代码是字符串,没有任何意义。

alert(a); //弹出的是下面的function
function a(){
  alert("预解析function")
}

3、注意这种情况

定义一个函数想要立即执行,写成如下形式是不可行的,在预解释的时候,它把它分解成两部分来对待,第一部分是fn函数,而第二部分是(),一个匿名函数,执行时会报错。如果小括号带参数,如(2),虽然不会报错,会打印出来2,但并不能把fn执行,也不能当成参数传递给fn函数。

function fn(){
//代码区
}()
如果你想实现立即执行的函数,可以把要执行的函数放到一对括号里面,对于JavaScript 来说,括弧()里面不能包含语句,所以在这一点上,解析器在解析function关键字的时候,会将相应的代码解析成function表达式,而不是function声明所以,只要将大括号将代码(包括函数部分和在后面加上一对大括号)全部括起来就可以了。 如下:

(function fn(){
//代码区...
}())
还可以写成:闭包。

(function(){
//代码区...
})();

4、 预解析需要注意的情况  

  预解析是发生在当前作用域下的,刚开始的时候,我们预解析的是全局作用域,在js中我们的global就是我们的window

  我们运行函数的时候会生成一个新的私有作用域(每次执行都是新的,执行完成就销毁)这个作用域下我们可以理解为开辟了一个新的内存空间。在这个内存中我们也要执行预解析。当我们的函数执行完成后,这个内存或者作用域就会销毁
  如果在当前作用域下的一个变量没有预解析,就会向它的上一级去找,直到找到window,如果window下也没有定义,就会报错。所以,在函数内通过var定义的变量是局部变量没有能过var 定义的变量是全局变量
  预解析不会在同一个变量上重复的发生,也就是一个变量如果已经在当前作用域下预解析了,不会再重复解析。
等号右边的function不会进行预解析。
alert(a);
fn();
var a = function fn(){};
第一次打印undefined,第二次报错,未定义,因为预解析的时候,=号右边是不进行预解析的。

预解释是不受其它if或者其它判断条件影响的,也就是说,即使条件不成立,我们里面只要有var或者function也会被预解释
alert(a); //undefined
if(1==2){
  var a=12;
}
后面定义的会覆盖前面定义的
alert(a); //弹出后面的function
function a(){
var b;
}
alert(a); //仍然弹出后面的function,因为function是提前预解析的
function a(){
var c;
}
JavaScript“预解析”是分段进行的,准确说是分<script>块进行的。

当我们的一个函数返回一个新的function,我们在外面定义一个变量来接收,这样这个函数的内存就不能在执行完成后自动销毁,也就是我们所谓的函数内存被占用了。

变量的值要看它在哪定义,this,要看它在哪调用的。

最新文章

  1. iOS多线程技术方案
  2. 更改apache网站根目录导致localhost不能访问
  3. UVA 11609 - Teams(二项式系数)
  4. netbeans php安装、调试
  5. extjs动态树 动态grid 动态列
  6. de4dot命令 v2.0.3.3405
  7. java中关于如何运行jar格式程序的说明
  8. Swagger+Spring MVC框架学习分享
  9. ls命令显示可执行的文件 ls -F
  10. 一次失败的刷题经历:[LeetCode]292之尼姆游戏(Nim Game)(转)
  11. 使用JavaCompiler编译java源文件
  12. Webdriver+Java实现使用cookie跳过登录
  13. Android Studio移动鼠标显示悬浮提示的设置方法
  14. ASP.NET Core源码学习(一)Hosting
  15. 设计模式_代理模式_在SqlSessionTemplate(Spring)中的应用
  16. protobuf 编译安装
  17. 阿里的Json解析包FastJson使用
  18. JMeter 教程汇总链接
  19. springMVC源码分析--视图AbstractView和InternalResourceView(二)
  20. 前端 HTML body标签相关内容 常用标签 表单标签 form里面的 input标签介绍

热门文章

  1. 20155230 2016-2017-2《Java程序设计》第一周学习总结
  2. 20155319 2016-2017-2 《Java程序设计》第十周学习总结
  3. spring 缓存机制
  4. Maven学习(十六)-----Maven插件
  5. cocos2dx2.0 帧动画的创建和播放过程 深入分析
  6. Appium+python的单元测试框架unittest(4)——断言(转)
  7. requests,unittest——多接口用例,以及需要先登录再发报的用例
  8. python模块的作用和说明
  9. Java实现在线预览功能
  10. 产品需求文档(PRD)的写作 【转】