全局范围变量及其赋值

时间:2016-03-15 18:12:39

标签: javascript this global

当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();




2 个答案:

答案 0 :(得分:1)

  

所以为什么在foo()中,“this.bar”给出了未定义的值,但是bar确实如此   不

可能您的var bar="bar";实际上并不在全球范围内。如果是你的代码将如图所示工作。引用bar将在任何父范围中找到变量。但是,this.barthis设置为全局对象时,需要在全局范围内定义的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()访问。