javascript变量声明提升
2015-07-12 18:09
609 查看
javascript变量声明提升(hoisting)
javascript的变量声明具有hoisting机制,JavaScript引擎在执行的时候,会把所有变量的声明都提升到当前作用域的最前面。先看一段代码
答案是:undefined
这段代码说明了两个问题,
第一,function作用域里的变量v遮盖了上层作用域变量v。代码做少些变动
第二,在function作用域内,变量v的声明被提升了。所以最初的代码相当于:
声明宣称一个名字的存在,定义则为这个名字分配存储空间,而初始化则是为名字分配的存储空间赋初值。
用C++来表述这三个概念
声明提升
当前作用域内的声明都会提升到作用域的最前面,包括变量和函数的声明
名字解析顺序
javascript中一个名字(name)以四种方式进入作用域(scope),其优先级顺序如下:
1、语言内置:所有的作用域中都有 this 和 arguments 关键字
2、形式参数:函数的参数在函数作用域中都是有效的
3、函数声明:形如function foo() {}
4、变量声明:形如var bar;
名字声明的优先级如上所示,也就是说如果一个变量的名字与函数的名字相同,那么函数的名字会覆盖变量的名字,无论其在代码中的顺序如何。但名字的初始化却是按其在代码中书写的顺序进行的,不受以上优先级的影响。看代码:
以上的名字解析优先级存在例外,比如可以覆盖语言内置的名字arguments。
命名函数表达式
可以像函数声明一样为函数表达式指定一个名字,但这并不会使函数表达式成为函数声明。命名函数表达式的名字不会进入名字空间,也不会被提升。
转自:http://openwares.net/js/javascript_declaration_hoisting.html
相关文章推荐
- JavaScript作用域链
- JSP中EL表达式入门与简介
- 1013: [JSOI2008]球形空间产生器sphere
- JavaScript 中值得注意的要点(1)
- 【JS总结】——JavaScript完结
- JS高级程序设计4-变量、作用域、和内存的问题
- JavaScript对象
- javaScript中的Date演示
- js原型链与继承(初体验)
- 总结的JS数据类型判定(非常全面)
- json字符串解析
- [LeetCode][JavaScript]Palindrome Linked List
- JSP/Servlet线程安全
- JavaScript作用域闭包(你不知道的JavaScript)
- JavaScript作用域闭包(你不知道的JavaScript)
- javascript 面向对象
- json字符串的拼接
- javascript位置相关知识点整理
- js中arguments的作用
- 弹窗开关js