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

看如下代码:

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对象吗?

谢谢诸位

阅读 4.2k
3 个回答

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

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

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

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题