这样写为什么弹出的会是undefined???

var v1= 250; function func1(){document.write(v1);//?? var v1 = 350;}
func1();

我实在是搞不懂,有谁能参透其中吗?这样写难道不是报错??

你把花括号都注释掉,确定没有报错?

var v1= 250; function func1(){ document.write(v1);//?? var v1 = 350; } func1();

完全没有问题

1、

<script type="text/javascript">
    var v1 = 250;
    function func1() {
        document.write(v1); 
        // var v1 = 350;
    }
    func1();
</script>

-- 输出250

2、

<script type="text/javascript">
    var v1 = 250;
    function func1() {
        document.write(v1); 
        var v1 = 350;
    }
    func1();
</script>

-- 输出undefined

根据js解析器,documen.write(v1),先局部找变量v1,这时候找到了v1=350;由于先后顺序,先定义,未赋值,等价于,var v1,所以此时输出undefined,就近原则找到就不向上找了。
而 // var v1 = 350;局部没有,就向上找全局,发现有,且初始化赋值了,所以输出250;

建议的写法是:

<script type="text/javascript">
    var v1 = 250;
    function func1(v1) {
        document.write(v1); 
        var v1 = 350;
    }
    func1(v1);
</script>

此时形参就是形参,输出250

你是不是没有换行?或者你在学校写的和你提问时写的换行格式不一样。
像这样的格式:
var v1= 250; function func1(){document.write(v1);//?? var v1 = 350;}
func1();
var v1=350那一句包括后面的花括号被注释掉了,不会有反应的。
像这种格式,就是func1函数里的局部变量v1声明提前的问题,声明了变量v1但未赋值,所以在document那里v1就是undefined
var v1= 250;
function func1(){
document.write(v1);
//??
var v1 = 350;
}
func1();