为何函数内外执行含var name的console.log语句结果不同?
问题分析
示例1:函数作用域内的变量
function func(){ var name console.log(name) name="pavan" console.log(name) } func()
运行结果:undefined pavan
示例2:全局作用域内的变量
var name console.log(name) name="pavan" console.log(name)
运行结果:pavan pavan
差异原因
两个代码的核心差异在于变量作用域不同,以及全局作用域中name变量的特殊行为:
函数作用域的
name
在函数func内部用var name声明的变量属于局部作用域。按照JavaScript变量提升规则,var声明的变量会被提升到作用域顶部,但不会初始化,所以第一次console.log(name)时变量未赋值,输出undefined。后续赋值为"pavan"后,第二次log输出对应值。全局作用域的
name
在浏览器环境的全局作用域中,name是浏览器内置的window.name属性(用于跨域窗口通信)。如果你的运行环境中window.name已经被预先设置为"pavan"(比如之前的代码操作或测试环境配置),此时用var name声明全局变量时,由于window.name已存在,var声明不会创建新变量,而是复用这个已有属性。因此第一次console.log(name)直接输出"pavan",后续赋值后第二次log依然输出该值。
若在标准浏览器环境中未修改过window.name,全局代码的第一次log应输出空字符串"",你给出的输出说明测试环境中window.name已被预设为"pavan",这才导致了和函数内代码的差异。
内容的提问来源于stack exchange,提问作者pavan octa
相关产品推荐
相关产品推荐

