本以为已经懂了js的作用域问题,下面这个现象突然让我懵逼了。

function test(){
            alert(1);
             function test2(){
                alert(2);
                alert(this);
            }
            test2();
            window.test2();
        };

        test();
        
        

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

阅读 4.7k
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 能不能访问到该函数

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/...

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