js中this、window及作用域的问题

发布于 2022-09-11 16:50:07 字数 572 浏览 41 评论 0

看如下代码:

function test(){
    console.log(this === window);
    show();
    window.show();
    function show(){
        console.log(this === window, 'fn');
    }
}
function show(){
    console.log(this === window, 'local');
}
test();

输出结果:
true
true "fn"
true "local"

我的理解是:
① 谁调用this所在的函数,this就代表谁
② 当一个函数和对象没用对象调用时,则默认是window对象
③ 当使用一个变量或函数时,优先使用当前作用域的变量和函数
第一个问题:我的理解对吗?

but(第二个问题,分3个小问题) ···
① test()函数中调用show()时,默认是window对象调用吗?
② 如果上面一条成立,那为什么和下面显式用window调用,结果不一样?
③ 局部变量和局部函数属于window对象吗?

谢谢诸位

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

旧城烟雨 2022-09-18 16:50:08

《javascript高级程序设计》中有说到:this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象调用时,this等于那个对象。不过,匿名函数具有全局性,因此this对象同常指向window

不过针对于匿名函数this具有全局性的观点仍是有争议的,具体this作用域问题可参考
【Javascript】深入理解this作用域问题以及new运算符对this作用域的影响

尤怨 2022-09-18 16:50:08

test里面的show是一个closure,closure中的this默认指向全局对象(windowglobal)。两个show调用结果一样的呀?

枯寂 2022-09-18 16:50:07

个人认为无论是全局函数还是局部函数(抛开那些改变bind的情况下),只要你不显式的指定bind的对象,在非严格模式下,它都会默认bind到全局对象上。

换句话说,不是因为window.show === show, 才认为show的调用者是window,而是因为show被单纯的用于简单的函数调用,所以才将this绑定到全局对象上。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文