看一段简单的javascript代码背后隐藏的问题
1.先看如下一段简单的代码:
var name = 'hello';
function test() {
alert(name);
}
test();
执行大家都知道会弹出 hello,没啥疑问.
2.那么在alert后面再加上一行代码后,如下:
var name = 'hello';
function test() {
alert(name);
var name = 'hi';
}
test();
大家猜猜会输出什么结果?
弹出的是一个 undefined。
3.在2的基础上,再做修改:
var name = 'hello';
function test() {
alert(name);
name = 'hi';
}
test();
为什么这次就输出hello呢?
4.这里牵涉到javascript的作用域,作用域链的知识。
网上的文章觉得讲得都有点教课化,看过之后觉得似懂非懂。
求通俗易懂的解答,最好能对两种情况做对比回答。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
第一段代码因为test里面没有name的声明,所以向上访问到外部的的name
第二段代码相当于
javascript引擎在进入作用域开始读取数据之前,会为这段作用域里所有被声明的变量和函数名开辟开辟一块内存,但内存里什么都没有,只是
undefined
。拿你上面的例子来说,在执行alert(name);
的时候,其实name
已经在内存中有一席之地了,只是还没有赋值,这时候alert
,就会返回undefined
。当执行到var name = 'hi';
的时候,才给name
的内存中保存了数据'hi'
。这东西叫做变量声明提升。
通俗的语言就是,调用函数,函数执行之前会扫描一边整个函数的代码。把其中的变量声明和函数声明提取出来。执行的这个函数作用域中创建这些变量,函数声明赋值为最后声明的那个函数,变量声明初始值为
undefined
。然后移除所有的变量声明和函数声明执行这个函数。
从实现的效果来看就是,变量可以先声明后使用(先不考虑
let
)。即使声明在后面,只要后面声明了也是一个局部变量。详见我的博客:http://zonxin.github.io/post/2015/10/javascript-hoisting
楼主的这一段代码
在浏览器处理的时候会变成:
这叫做变量提升。
这是我之前学习总结的。希望对你有所帮助。