Javascript “this”上下文如何在立即自动执行的函数中工作?

Javascript “this”上下文如何在立即自动执行的函数中工作?,javascript,Javascript,有人能解释一下这里发生了什么导致我的属性被附加到窗口对象上吗: var MyObject = (function () { this.property1 = "prop1"; return this; })(); // window.property1 now exists as well as MyObject.property1 这是“正确”的方法吗: var MyObject = (function () { var MyObject = {};

有人能解释一下这里发生了什么导致我的属性被附加到窗口对象上吗:

var MyObject = (function () {    
    this.property1 = "prop1";

    return this;
})();
// window.property1 now exists as well as MyObject.property1
这是“正确”的方法吗:

var MyObject = (function () {
    var MyObject = {};
    MyObject.property1 = "prop1";

    return MyObject;
})();
// only MyObject.property1 now exists

您正在调用一个函数。不管它是否匿名,它都是一个函数。函数有上下文,
this
关键字

您没有提供上下文,因此使用了
窗口

尝试:


在这里,您明确地将上下文定义为“无论当前上下文是什么”-当然,这也可能是
窗口,但也可能不是-如果没有看到更多代码,就无法真正判断。

您正在调用一个函数。不管它是否匿名,它都是一个函数。函数有上下文,
this
关键字

您没有提供上下文,因此使用了
窗口

尝试:


这里,您明确地将上下文定义为“无论当前上下文是什么”-当然,这也可能是
窗口
,但也可能不是-如果看不到更多的代码,就无法真正判断。

没有更多的代码。这就是全部。我只是想弄清楚如何正确地封装东西。对.call()的调用并不完全直观。你说我没有提供上下文,我假设变量MyObject=。。。部分是背景。你能解释一下发生了什么吗?再详细一点。。。如果要将变量的作用域限定到函数体,只需使用var关键字,而不是分配给它。或者,您可以将上下文绑定到函数。e、 g.
var property1='prop1'@AndrewLeith如果您的印象不正确,那么:范围和上下文是两件不同的事情。你应该使用你在问题中给出的第二段代码。@andrew:如果你这样认为,我很抱歉。虽然答案中有解释,但您似乎对它为什么是
窗口感到困惑,所以我只想确保您完全阅读它。如果您想了解此
的工作原理,请查看MDN文档,该文档非常广泛:。Fwiw,yes函数创建作用域,但是
this
的值与作用域无关,它由函数的调用方式决定。因为
返回此
myobject
现在是
窗口
。没有更多的代码了。这就是全部。我只是想弄清楚如何正确地封装东西。对.call()的调用并不完全直观。你说我没有提供上下文,我假设变量MyObject=。。。部分是背景。你能解释一下发生了什么吗?再详细一点。。。如果要将变量的作用域限定到函数体,只需使用var关键字,而不是分配给它。或者,您可以将上下文绑定到函数。e、 g.
var property1='prop1'@AndrewLeith如果您的印象不正确,那么:范围和上下文是两件不同的事情。你应该使用你在问题中给出的第二段代码。@andrew:如果你这样认为,我很抱歉。虽然答案中有解释,但您似乎对它为什么是
窗口感到困惑,所以我只想确保您完全阅读它。如果您想了解此
的工作原理,请查看MDN文档,该文档非常广泛:。Fwiw,yes函数创建作用域,但是
this
的值与作用域无关,它由函数的调用方式决定。因为
返回此
myobject
现在是
窗口
。我不确定您对什么感到困惑。如果调用像
foo()
这样的函数,则
指的是
窗口
。你认为它还会指什么?你期待什么?为什么?@FelixKling你认为Javascript有意义吗?没有。你知道这一点,所以你不再感到惊讶,但这一点也不完全是不言自明的。不要假装是。为了回答标题中的问题,
这个
在iLife中的工作方式与任何其他函数调用中的工作方式相同。IILife没有什么特别的,函数定义和执行只是放在一个语句/表达式中,而不是放在两个语句/表达式中。我不知道你对什么感到困惑。如果调用像
foo()
这样的函数,则
指的是
窗口
。你认为它还会指什么?你期待什么?为什么?@FelixKling你认为Javascript有意义吗?没有。你知道这一点,所以你不再感到惊讶,但这一点也不完全是不言自明的。不要假装是。为了回答标题中的问题,
这个
在iLife中的工作方式与任何其他函数调用中的工作方式相同。IIFE没有什么特别之处,函数定义和执行只是放在一个语句/表达式中,而不是放在两个语句/表达式中。
var MyObject2 = (function() {
    this.property1 = "prop1";
    return this;
}).call(this);