javascript - 关于js作用域及执行环境的问题
PHPz
PHPz 2017-04-11 12:04:41
[JavaScript讨论组]
            window.onload = function(){
            var  b = 1;
            alert(this);
            Test();
            }
    function Test(){
         alert(this);
        alert(b);
    }
    

test方法在onload事件函数里执行,那这方法应该是在onload事件函数的作用域内,同时我打印onload事件的指向与test方法的指向,都是window,不明白为什么方法Test获取不到变量b,往前辈们指点下,谢谢。

PHPz
PHPz

学习是最好的投资!

全部回复(6)
天蓬老师
  1. var 声明 b 和调用 b 是在两个独立的代码块内
    独立的代码块内声明的变量不能互相调用。

  2. this 指向是调用体所决定的。
    调用时是 Test() 这种形式,这和 Test() 在哪写的无关。
    你甚至可以将 Test() 理解为 window.Test() ,里面的 this 指向为 window

大家讲道理

函数作用域是在声明时决定的,而不是运行时决定。
因为onload事件函数和test函数平级,自然找不到onload函数中的b咯

PHPz

你先得了解,静态作用域(词法作用域)以及 动态作用域的概念。
之后可以了解AO/VO。
javascript 执行环境,变量对象,作用域链

天蓬老师

因为变量b是在onload函数作用域下,并非在window作用域。而Test在全局作用域下声明的,不是在onload函数体内声明的,变量b也不会按闭包方式传入Test函数。

window.onload = function(){
     var b = 1; 
     console.log(this.b)    // undefined 发现没,window下并没有变量b
     Test();
}

window.onload = function(){
     this.b = 1;   
     console.log(this.b);    // 1
     Test();
}
// alert 1
PHPz

看完这篇文章你应该就懂了浅析JavaScript中作用域和作用域链

高洛峰

上下文环境和作用域关系在声明时确定,与在哪里调用无关。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号