var a = "hello";
function b ()
{
alert(a);
var a = "world";
alert(a);
}
b(); //为什么第一个alert是undefined
var a = "hello";
function b ()
{
alert(window.a);
var a = "world";
alert(a);
}
b(); //为什么这样子就没问题了呢?
第一段代码中,为什么第一个alert是undefined啊?
第二段代码,为什么加了window后就能弹出hello呢?
上面几位朋友都说的很好,我再补充几点Javascript高级程序设计中说的。
当代码在一个环境中执行时,会创建变量对象的一个作用域链。作用域的用途,是保证对执行环境有权访问的所有变量和函数的有序访问。作用域的前端,始终都是当前执行的代码所在环境的变量对象。标识符的解析是沿着作用域链一级一级地搜索标识符的过程。搜索过程始终都是从作用域链的前端开始,然后逐级地向后回溯,直至找到标识符为止。
--《Javascript高级程序设计》
所以对于函数来说,遇到了变量,会根据作用域链从前往后搜索。可以这样理解,在调用某函数的时候,函数内部的代码成为了其作用域链的前端,然后是外部,全局一定是最后的。
重点是在搜索这里,就是说,在函数内部,遇到一个变量的话,会先从内部进行搜索,没有的话就搜外部(沿着作用域链)。
再看看你那个函数,alert(a)
出现了a变量,好了,开始在函数内部进行搜索,发现a已经声明了,但是却是在这之后定义的"world"
,所以就是undefined啦。这就是所谓的变量提升。你把后面的声明去掉会发现alert(a)
是"hello"
。
var a = "hello";
function b ()
{
console.log(a);
}
b();//hello
搜索也是有顺序的,例如有参数的话肯定是先从参数开始。
var scope = "globe";
function t(scope){
console.log(scope);
var scope = "local";
console.log(scope);
}
t();// undefined local
t("woshichulaigaosiaode"); // woshichulaigaosiaode local
enjoy!
js的变量声明提升。即当你用var定义的变量,不管在任何位置,都提前到函数顶端。你的函数1的相当于这个函数:
var a = "hello";
function b ()
{
var a;//你所有的var定义变量都会提升到函数的顶部
alert(a);//这时候的a是未定义的,所以弹出underfined
a = "world";//这步是给a初始化为“world”
alert(a);
}
b(); //为什么第一个alert是undefined
而第二个函数是
var a = "hello";//这个a是全局变量,相当于window对象下面的变量
function b ()
{
alert(window.a);//所以window.a弹出hello
var a = "world";
alert(a);
}
b(); //为什么这样子就没问题了呢?
var a = "hello";
function b ()
{
alert(a);
a = "world";
alert(a);
}
b();
var a = "hello";
function b ()
{
alert(a);
var a = "world";
alert(a);
}
b(); //为什么第一个alert是undefined
等价于
var a;
a = "hello";
function b ()
{
var a;
alert(a);
a = "world";
alert(a);
}
b();
原因是 变量声明提升
变量声明无论出现在代码的任何位置,都会在任何代码执行之前处理。
https://developer.mozilla.org/zh-CN/docs...
js中不仅有变量提升 还有函数提升,建议楼主都看下
你可以去了解一下js里的变量声明提升。看懂之后,这个问题应该能够明白了。
永远都有人问这个问题,不能正正经经的把JS的书看完么
因为JavaScript有变量提前机智,只有执行到赋值的那一行才会初始化!
多去学习下JS的基础,涉及变量作用域和var 关键字声明变量的预解析
var a = "hello";
function b ()
{
alert(a);
var a = "world";
alert(a);
}
b();
上面的 b 函数里面的代码
其实 等同于下面这段代码
function b()
{
var a;
alert(a);
a="world";
alert(a);
}
所以第一次alert(a) 为 undefined 而不是 你以为的 全局的 a;这个涉及到的是 js的预编译这个点
类似“预编译”的操作:
首先会创建一个当前执行环境下的活动对象,并将那些用var申明的变量设置为活动对象的属性,但是此时这些变量的赋值都是undefined,并将那些以function定义的函数也添加为活动对象的属性,而他们的值正是函数的定义
也就是说:
console.log(a); //undefined
console.log(fn) //function
var a=1;
function fn(){return 1;};