js全局环境下的this是window,直接foo()调用时,this是什么,结果undefined,为什么?


直接上代码


 <script type="text/javascript">
   'use strict';
    console.log(this === window); // true
    var foo = function() {
        console.log(this === window);
        console.log('this:',this);
    };
    foo();
    window.foo();
</script>

clipboard.png

this JavaScript

十六夜・咲夜 9 years, 10 months ago

我了个去,小俞的正确答案居然被忽略了,还写了个:答非所问。
我也是醉了。
如果没有"use strict"
foo中的this就是window
你用了"use strict", foo中的this指向window是被禁止的,但是除了window之外,foo中又没有其他作用域链了,所以this就是undefined。
所以:


 this === window // false
this === undefined // true

QQ163 answered 9 years, 10 months ago

看语言精粹里说一般函数this的设定是语言设计上的一个错误,如果设计正确,那么内部函数被调用时this应该指向外部函数的this变量。所以,我之前也觉得一般的函数这个this有点蛋疼的,无法理解。

Joumey answered 9 years, 10 months ago

和函数的返回值或者console.log的返回值没什么关系;这里是因为有 "use strict" ,在严格模式下,重新规定了执行上下文中的 this 禁止函数中this关键字指向全局对象 ,直接 foo() 这样的话,函数中this就是undefined。反之,如果不使用严格模式,那么this就是window了。可以参见阮一峰的这篇 http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html

78164 answered 9 years, 10 months ago

因为你声明了严格模式
'use strict';
严格模式下,禁止this关键字指向全局对象

吐槽不吐葡萄皮 answered 9 years, 10 months ago

函数没有明确返回值的情况下,都是返回undefined的

淡定的蛋痛 answered 9 years, 10 months ago

use strict 的问题,严格模式下禁止 this 指向全局变量,参见: http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html

OTKIA answered 9 years, 10 months ago

Your Answer