首页 > 关于一个函数声明问题,为什么alert出来的是undefined?

关于一个函数声明问题,为什么alert出来的是undefined?

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;};
【热门文章】
【热门文章】