javascript - 本以为已经懂了js的作用域问题,下面这个现象突然让我懵逼了。
PHP中文网
PHP中文网 2017-04-11 13:01:26
[JavaScript讨论组]
function test(){
            alert(1);
             function test2(){
                alert(2);
                alert(this);
            }
            test2();
            window.test2();
        };

        test();
        
        

test2()执行的时候弹出了 this 是 window,这样的话 在我的理解中 那他就是作用在 window对象下的,相当于 window.test2 = function(){};然后在 下一行 用对象方法的形式调用 window.test2();结果居然报错undefined,我瞬间有点不懂了!!!!

PHP中文网
PHP中文网

认证0级讲师

全部回复(8)
高洛峰

早,this 值通过不同的调用方式,指向不同的对象。在这里,普通的调用方式,非严格模式下,this 将指向 window。显而易见,window 对象并没有 test2 函数。

高洛峰

执行test后,首先执行alert(1),然后执行test2这时候,由于是非严格模式,这里this的绑定是默认绑定到window。所以执行test2,alert(2)并且输出this既window。然后执行window.test2由于全局作用域中没有test2所以报错

怪我咯

函数自执行返回window 然而window下没有test2这个方法 test2仅仅作用于test内部没有丢出去 window底下找不到 返回未定义undefined

高洛峰

我执行的结果是1 2 [object window] 然后报错Uncaught TypeError: window.test2 is not a function(…)。

我理解的是在JS里,一个function的定义会生成一个局部作用域用以包含在其内声明的变量,这个作用域是被包裹在全局作用域(window)里的。

结合这个例子,test是在全局作用域里声明的,属于window,所以可以像window.test那样使用, 当执行进入到test内部, 就存在一个相对独立的作用域(可以想象成大盒子里面有个小盒子, 作用域的一个特性就是 可以从小盒子里往外到大盒子里查找变量,反过来,小盒子却无法让大盒子往他里面查找变量或者理解为每个盒子都只能向外面的盒子查找),test2则是定义在这个小盒子里的局部变量,类似于window.test, 这里大概是"局部作用域object".test2(只不过我不知道“局部作用域object”的引用变量名是什么), 所以当你使用window.test2, window在自己的大盒子里找不到, 又不能到小盒子里去找,所以就报undefined。

我不知道对不对, 但是我自己这么想可以解释通

巴扎黑

实际上是你把 this 指向跟作用域搞混了,this 并不一定是指向函数的作用域。
this 指向大致分四种情况,
作为普通函数调用的时候,指向 window(严格模式下是 undefinded),
作为方法调用,指向调用它的对象,
作为构造函数,指向构造函数返回的对象
函数下的 apply, call 方法可以给函数绑定 this 。

具体可以去翻翻《JS权威指南》关于作用域,this 相关的章节。

怪我咯

非严格模式下,函数作为普通函数调用,其 this 指向 window,不论 window 能不能访问到该函数

PHP中文网
function test1(){
  //你的代码
  function test2(){}//test1的内部函数
}

function test2(){//window下的全局函数
  //一些代码
}

懂了吗?你的test2只是test1的内部函数,不属于window
你只是把自己给绕晕了

高洛峰

本来不想说,感觉答案里面没有真正的回答题目的疑问,为什么你的理解出错,是因为你的这句话是错的:
在我的理解中 那他就是作用在 window对象下的,相当于 window.test2 = function(){};
首先test2内部this指向window,并不等价于window.test=function(){};这是完全错误的结论;test2执行的时候this会变成window是因为调用test2的不是一个referenceType,this是null,就和console.log.call(null,this)中this依然指向window是一个道理,这里的this也被修改为window,更详细的可以去看下汤姆大叔的博客http://www.cnblogs.com/TomXu/...

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

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