为什么`this`创建一个全局变量而不是使用调用站点中的变量?

时间:2018-03-10 08:25:21

标签: javascript this

我正在阅读你不知道JS 的书籍,而且我正在使用 this和Object Prototypes

我知道this指的是我需要查看呼叫网站的内容。呼叫站点是this将引用的内容。我没有得到的是为什么这段代码不能正常工作(我只是写它来理解this,而不是因为任何工作问题或任何事情)。

function foo() {
  console.log(foo.hasOwnProperty('a')); // 1
  console.log(window.hasOwnProperty('a')); // 2
  console.log(this.a); // 3
  this.a++;
  console.log(window.hasOwnProperty('a')); // 4

}
function bar(){
  foo.a = 42;
  foo();
}
bar();
  1. 如果您查看bar中为a创建foo属性的第一行,并为其指定值42.如果我评论此行,则运行console.log(foo.hasOwnProperty('a'));让我虚假。如果我运行它,那么它返回true。但如果是这种情况,那么调用bar确实为foo创建了一个a属性,对吧?这导致了问题3.

  2. 我知道此时window.a不存在。

  3. 为什么返回undefinedthis应解析为foo.a,对吗?因为this的上下文会在bar中,对吗? Bar是呼叫网站。但是,无论undefined是否已被注释,这仍然是foo.a = 42

  4. 为什么在运行true之后会立即返回this.a++?如何以及为什么要创建全局变量?

2 个答案:

答案 0 :(得分:2)

注意:这只是思考Photo.new( image: "data:image/jpeg;base64,#{image_json}", image_file_name: 'file.jpg' # this way you can provide file_name ) 的一种简单方法。在复杂的情况下(例如使用this或OOP时),以下内容可能不准确。

.bind(),默认情况下,sorta指的是包含被调用函数的对象。例如,如果我做了

this

var obj = { fxn: function() { console.log(this.bar); }, bar: 3 } obj.fxn(); // (1) var fxn = obj.fxn(); fxn(); // (2) 将“3”打印到控制台;因为在某种程度上,通过“(1)”调用fxn“,obj将指向this。换句话说,因为您正在调用存储在obj内的fxn副本,obj将指向this

obj将(假设(2)未在其他地方定义)打印未定义。那是因为bar没有被称为“通过”任何东西。因此,它假装通过fxn调用fxn

虽然在您的示例中,windowfoo中被称为,但bar并未调用bar的版本...好吧,存储在自己内部。 foo不会通过“bar来调用foo ...”。

不可否认,这很令人困惑。也许这会消除一些困惑:如果你将foo更改为:

bar

它将打印function bar(){ foo.a = 42; foo.foo = foo; foo.foo(); } 而不是未定义。重要的是,42被调用的对象将是foo。例如,

this

还会打印42。

答案 1 :(得分:1)

在foo this中引用父对象 - 即窗口。

所以this.awindow.a指的是同一件事。

  

因为这个上下文会在bar中,对吗?

不正确的。酒吧"这个"在foo中你需要applycallbind foo传递你想要的"这个"作为背景。即。

foo.call({});

or 

foo.bind({});

会使"这个"和foo中的空对象。

  

在运行this.a ++之后,为什么现在返回true?怎么样,为什么   正在创建一个全局变量?

出于同样的原因 - 当你这样做时.a ++你正在创建一个全局变量a并将其递增。