跪求大神解释为什么最后输出的是goodbye sam ?函数中的name为什么不是Tom?

 <script type="text/javascript">
    var name="Tom"; 
    $(function(){
        console.log(name);
        if(typeof name==="undefined"){
            var name="sam"
            console.log("goodbye "+name);
        }else{
            console.log("hello"+name);
        }
    });
</script>

js作用域链的规则。在调用一个变量时(这里是name),
会从这一层的作用域开始找,一直找到全局变量(没找到就返回undefined,其中只要找到就会直接返回。),
在这里你定义的name="tom" 是全局变量, 而 name="sam"是局部变量。console.log(),是在局部作用域开始找变量name,这里有sam (直接返回)
就不会去找全局变量"tom"了

楼上根本没有好好看楼主提出的问题。
反复推敲一下应该明白,楼主其实想问的是:
为什么最后输出的结果是"goodbye sam"而不是"hello tom"。
因为"goodbye sam"那里是因为做了一个判断:name这个变量没有定义。
但实际上,楼主代码的第一行就已经初始化了name变量,并给它赋值tom了。
之所以会输出"goodby sam",是因为变量的声明在$(function(){...})之外了。
如果这样写:

 <script type="text/javascript">
    var name = "Tom"; 
    $(function(){
        var name= "TOM"
        console.log(name);
        if(typeof(name)==="undefined"){
            var name="Sam"
            console.log("goodbye "+name);
        }else{
            console.log("hello "+name);
        }
    });
</script>

最后输出的结果就为:
图片说明

第一行的var name = "Tom"中name为全局变量 ,为什么作用不了 $(function(){...}中的第一行判断???

你把这些语句是放在body里吗?如果不是,放在body中试下。。

你的这一部分js片段放在什么位置,加载时机是会有影响的,$(function(){...})这里面的东西在页面body加载完成后加载,另外就是就近查找,console.info(name)第一找到的 name不是tom,正如一楼所说的,此时未定义,不知道你把var去掉会是什么效果

这涉及到执行上下文建立过程和js作用域的知识,你把局部作用域var name = “sam”;这句话注释掉再运行一下结果看看。 如果还有不懂或者我有说错什么,我们可以探讨下图片说明