在下面的代码中:
var x = {
y: function() {
console.log(this === global); // false
function z() {
console.log(this === global); // true
};
z();
}
};
x.y();
当您致电y
时,您正在提供x的执行上下文。因此this
是x对象。
为什么z
的执行上下文是全局对象(或浏览器中的窗口对象)?
似乎无法按照定义的方式为z
创建不同的执行上下文。即this.z()
,global.z()
,x.z()
,y.z()
所有错误,表明该执行上下文中没有z
函数的消息。
因此,在全局对象的执行上下文中定义function name() {}
形式定义的函数是总是是真的吗?并且除非使用call / bind / apply来调用函数,否则执行总是在全局对象上下文中?
问题:为什么这种形式的函数function name() ...
在全局上下文中定义而不是在它写入的对象的上下文中定义?
以上内容是对本文的回应:http://www.digital-web.com/articles/scope_in_javascript/
“如果我们只是称之为正常的日常功能......
<script type="text/javascript">
function test_this() {
return this;
}
var i_wonder_what_this_is = test_this();
</script>
在这种情况下,我们没有提供新的上下文,也没有给出一个背景形式的上下文来捎带。在这里,这默认引用它可以做的最全局的事情:对于网页,这是窗口对象。“