为什么这个关键字不是指独立JS函数中的窗口

时间:2014-11-11 15:07:54

标签: javascript jsfiddle

我只是在JS中尝试使用作用域和这个关键字,在编写下面的代码时我真的很困惑,因为我在调用console.log(a)f()之后期待5,而是它给了我10

我的问题是:

  1. 独立功能中的this关键字是指window
  2. 如果是,那么函数内的代码与window.a = 5相同 并且a的值应更新为5
  3. 如果不是,为什么console.log(this)会产生窗口,而a的值会产生var a = 10; function f(){ this.a = 5; console.log(a); } console.log(a); f(); console.log(a); 是全球的)还没有更新?
  4. JS Fiddle

    {{1}}

4 个答案:

答案 0 :(得分:9)

如果代码在全局范围内运行,那么它将产生您期望的结果。你的jsFiddle的问题是它在全局范围内运行。因此var a;创建本地变量a,而this.a引用全局变量a

以下是您在全球范围内运行的代码:http://jsfiddle.net/grayoork/(请注意"无包装 - ...")设置。

参考:MDN - this


因此,var a;this.a都将引用相同的变量iff:

  • 代码在全局范围内运行
  • {li> thisf内引用全局对象,如果是这样的话
    • f执行为f()且未绑定,或绑定到全局对象
    • f未处于严格模式。

答案 1 :(得分:1)

这是JSFiddle特有的,因为它们包装了它们的功能。如果您使用Chrome控制台,并点击要记录的文件,则会获得除代码之外的其他内容。这是正在执行的实际JS:

window.onload=function(){
var a = 10;

function f(){
    this.a = 5;
    console.log(this);
}

console.log(a);
f();
console.log(a);


}

现在很清楚发生了什么 - a根本不是全球性的!它的范围是onload函数。

答案 2 :(得分:0)

这指的是当前上下文 - 查看javascript调用并应用可以切换上下文的函数 在函数中,这指的是函数,除非以设置上下文的方式调用函数,例如someobject.function()或通过使用call或apply

答案 3 :(得分:-1)

如果在函数内部使用this,则其范围仅适用于该函数。因此var a = 10;this.a = 5是两个不同的变量。