当foo()被调用时,"这个"内部foo函数指的是全局范围和" bar"变量已经被定义并被赋值为" bar"。
所以为什么在foo()," this.bar"给出未定义的值但是bar没有。
function foo(){
this.baz = "baz";
console.log(this.bar + " " + baz); //undefine baz
console.log( bar + " " + baz); //bar baz
}
var bar="bar";
foo();

答案 0 :(得分:1)
所以为什么在foo()中,“this.bar”给出了未定义的值,但是bar确实如此 不
可能您的var bar="bar";
实际上并不在全球范围内。如果是你的代码将如图所示工作。引用bar
将在任何父范围中找到变量。但是,this.bar
将this
设置为全局对象时,需要在全局范围内定义的bar
。因此,我们得出结论,var bar="bar";
实际上并不在全球范围内。
当您进行正常的函数调用并且未在strict
模式下运行时,this
将被设置为浏览器中window
的全局对象。一般来说,这不是this
的推荐用法,事实上,它会在strict
模式下中断。但是,我将解释您的代码中发生了什么。
在您的具体示例中,您可以将this
替换为window
,而您的代码基本上是这样做的:
function foo(){
window.baz = "baz";
log(window.bar + " " + baz);
log(bar + " " + baz); //bar baz
}
window.bar="bar";
foo();
// display output
function log(x) {
var div = document.createElement("div");
div.innerHTML = x;
document.body.appendChild(div);
}
而且,这是使用this
时的版本:
function foo(){
this.baz = "baz";
log(this.bar + " " + baz);
log(bar + " " + baz); //bar baz
}
bar="bar";
foo();
// display output
function log(x) {
var div = document.createElement("div");
div.innerHTML = x;
document.body.appendChild(div);
}
而且,正如您所看到的,当您运行任一代码段时,没有undefined
值。
如果您以strict
模式运行代码(强烈推荐),则在正常函数调用中this
将设置为undefined
,您的代码将失败。相反,只有当您知道它已经被特别设置为您想要的值时才使用this
,例如在使用new
调用的构造函数中,或者在方法调用中或在专门设置{{ 1}}到已知值(可能包含this
或.call()
)。
答案 1 :(得分:0)
在javascript中,当在全局范围中定义函数时,就像在示例中一样,this
的值是全局对象。在您的情况下,由于bar
是全局定义的,因此可以通过this.bar
函数中的foo()
访问。