当前位置: 首页 > 知识库问答 >
问题:

为什么iLife这个关键字指的是窗口对象。。?

年风华
2023-03-14

当我运行下面的IFFE时,为什么this关键字引用窗口对象而不是a变量?

var a = {
 printThis : function () {
 console.log('printThis', this);
  var inner = (function () {
    console.log('inner', this);
   })();
  }
};

a.printThis(); 

产生以下输出:

printThis **an object**

inner **window object**   <-- why..?
var a = {
  printThis: function() {
    console.log('printThis', this);
    var inner = (function() {
      console.log('inner', this);
    })();
  }
};

a.printThis();

共有1个答案

韦望
2023-03-14

考虑以下示例:

var a = {};
var b = {};
a.hello = function() { console.log(this); };
b.hello = a.hello;

在大多数编程语言中,b.hello()将打印a,因为它们基于函数的位置。函数在a中,所以thisa。有道理,对吧?

然而,JavaScript在这方面有点不同。b.hello()b上调用Hello,因此this被设置为b。这也很有意义,因为JavaScript实际上没有一个函数“在哪里”的概念(不像Java中的方法,它们总是与特定的类联系在一起),而且很难确定a在哪里“是”。

因此,foo.bar()将始终设置thisfoo,以便调用bar(除非使用了bind或类似于bind)这预先指定一个特定的值)。

现在,一个生命在。。。没什么,真的。这不是一个foo。bar()情况,它只是一个bar()其中bar是您的函数表达式。在没有foo的情况下,它默认为窗口对象。

有两种简单的解决方法:

  1. 在IIFE之外创建一个变量,包含您感兴趣的值:var,该变量=this 并在生活中使用that而不是this,或

 类似资料:
  • 我是Python的初学者。我合并了两个之后,我试图用另一个列值更改一个列的'未分配'值。我不能那样做。如果我使用,那么我可以更改。 我从页面上抓取了一个表,然后修改了数据框中的数据。 pip安装lxml 这是我使用的代码。 我希望将邻域值更改为自治区值。 我得到了这个错误。 KeyError回溯(最近一次调用上次)/usr/local/lib/python3。6/数据包/熊猫/核心/索引/基础。p

  • 问题内容: 我读苹果文档 ,当我发现这句话: 本类仅包含一个属性:。 此属性存储对应用程序窗口的引用。此窗口表示应用程序视图层次结构的根。这 是绘制所有应用程序内容的地方。请注意,window属性是 可选的 ,这意味着 在某些时候它可能没有任何值(为nil ) 。 我不明白的是:为什么此属性有时可能为零? 变成零的情况是什么? 问题答案: 当您关闭应用程序时,您的应用程序仍可以接收静默通知 或在后

  • 我理解这是指当前对象。所以,与其使用 为什么我不能使用 请参考下面的例子,并在最后看到最后两个评论。

  • 问题内容: 我阅读了一些有关该关键字的文章,但无法弄清其正确用法。您能否告诉我在C#和Java中应该使用什么? 问题答案: 对于C#和Java,“ volatile”告诉编译器一个变量的值一定不能被缓存,因为它的值可能会在程序本身范围之外改变。然后,如果变量“超出其控制范围”更改,编译器将避免可能导致问题的任何优化。

  • 问题内容: 在JavaScript中的关键字可能会相当混乱首次遇到它的时候,人们往往会认为JavaScript是不是面向对象的编程语言。 它是什么? 它解决什么问题? 什么时候合适,什么时候不合适? 问题答案: 它做五件事: 它创建一个新对象。这个对象的类型就是 object 。 它将这个新对象的内部不可访问的 [[prototype]] (即 proto )属性设置为构造函数的外部可访问 原型

  • 问题内容: 来自标准库的文件包含围绕228行的以下几行代码: 在这种情况下是什么意思,或者通常是什么关键字? 问题答案: 是Swift 3中的新访问级别,随实现而引入 SE-0117允许区分公共访问权限和公共替代权限 从2016年8月7日开始,Swift 3快照和Xcode 8 beta 6都可以使用它。 简而言之: 在定义模块之外, 可以访问 和 可继承 一个类。一类成员是 可访问 和 可重写