JavaScript中的自调用函数

JavaScript中的自调用函数,javascript,Javascript,我知道提升的一般规则,变量和函数在编译阶段被提升 因此,任何东西都写如下 var foo = 'global'; 将汇编为: var foo; // Undefined foo = 'global'; // Declared 但这是我无法理解的 为什么myObject中的自调用函数打印全局foo/获取窗口上下文 一般来说,我试图理解的是它被吊到了哪里。添加console.log(这个)

我知道提升的一般规则,变量和函数在编译阶段被提升

因此,任何东西都写如下

var foo = 'global';
将汇编为:

var foo; // Undefined
foo = 'global'; // Declared
但这是我无法理解的


为什么
myObject
中的自调用函数打印全局foo/获取窗口上下文

一般来说,我试图理解的是它被吊到了哪里。

添加
console.log(这个)console.log(this.foo)
之前,您将看到
this
实际上只是
窗口。这就是您获得全局
foo
的原因

直接调用函数时,
的默认值为“全局对象”;在浏览器中,全局对象是
窗口
。在这种情况下,您还将看到
窗口

function foo() {
    console.log(this);
}
foo();
因为您已经定义了一个函数表达式并立即调用了它,所以它本质上是直接调用函数(类似于您直接调用常规函数的方式)。

Add
console.log(this)console.log(this.foo)
之前,您将看到
this
实际上只是
窗口。这就是您获得全局
foo
的原因

直接调用函数时,
的默认值为“全局对象”;在浏览器中,全局对象是
窗口
。在这种情况下,您还将看到
窗口

function foo() {
    console.log(this);
}
foo();

因为您已经定义了一个函数表达式并立即调用了它,所以它本质上是直接调用函数(类似于您直接调用常规函数的方式)。

窗口是一个全局上下文,在其中执行所有操作(通常)

在函数外部(或在没有
var
的函数中)声明的任何内容都被视为全局对象的属性(方法)

例如,当您调用
setTimeout(foo,1000)
setInterval(foo,1000)
时,它被视为
window.setTimeout(foo,1000)
window.setInterval(foo,1000)

本部分:

func: function(){
  console.log(this.foo); // local
  (function(){ 
     console.log(this.foo); // global
  })();
当您调用第一个
console.log
时,它在作为对象方法的函数内部被调用。下一个
console.log
是另一个函数的内部调用,该函数与
func
不在“同一级别”,因此默认情况下其调用上下文是全局对象

当然,您可以通过放置以下行来存储对对象本身的引用:

var self = this
因此,代码如下所示:

func: function(){
  console.log(this.foo); // local
  var self = this;
  (function(){ 
     console.log(self.foo); // now it's local
  })();
二,


问题更多的是关于自调用函数。是否将自调用功能提升到myObject的外部/上方

在您的特定情况下

提升是关于函数内部的变量声明

对象声明不是一回事
func
只是对象的一个属性。在功能定义中可以满足以下条件:

foo = "global";
var test = function(){
    var foo;
    // Declared but not defined
    console.log(foo);
    foo = 'local';
    // Now it's defined. Thanking to functional scope, the function "sees" local variable
    console.log(foo);
}
或者更好:

foo = 'global';
var test = function(){
    console.log(foo); // undefined, but declared
    var foo;

    foo = 'local';
    console.log(foo);
}

窗口是一个全局上下文,在其中执行所有操作(通常)

在函数外部(或在没有
var
的函数中)声明的任何内容都被视为全局对象的属性(方法)

例如,当您调用
setTimeout(foo,1000)
setInterval(foo,1000)
时,它被视为
window.setTimeout(foo,1000)
window.setInterval(foo,1000)

本部分:

func: function(){
  console.log(this.foo); // local
  (function(){ 
     console.log(this.foo); // global
  })();
当您调用第一个
console.log
时,它在作为对象方法的函数内部被调用。下一个
console.log
是另一个函数的内部调用,该函数与
func
不在“同一级别”,因此默认情况下其调用上下文是全局对象

当然,您可以通过放置以下行来存储对对象本身的引用:

var self = this
因此,代码如下所示:

func: function(){
  console.log(this.foo); // local
  var self = this;
  (function(){ 
     console.log(self.foo); // now it's local
  })();
二,


问题更多的是关于自调用函数。是否将自调用功能提升到myObject的外部/上方

在您的特定情况下

提升是关于函数内部的变量声明

对象声明不是一回事
func
只是对象的一个属性。在功能定义中可以满足以下条件:

foo = "global";
var test = function(){
    var foo;
    // Declared but not defined
    console.log(foo);
    foo = 'local';
    // Now it's defined. Thanking to functional scope, the function "sees" local variable
    console.log(foo);
}
或者更好:

foo = 'global';
var test = function(){
    console.log(foo); // undefined, but declared
    var foo;

    foo = 'local';
    console.log(foo);
}

因为
这个
在IIFE中是
窗口
。调用它的执行上下文是全局上下文。这是因为未在对象(如
obj.func()
上调用函数,因此
默认指的是
window
。是否仅当声明obj.func()时才执行自调用函数。@patz它与提升无关。您对上下文的理解不适合js…因为IIFE中的
这个
窗口
。调用它的执行上下文是全局上下文。这是因为未在对象(如
obj.func()
上调用函数,因此
默认指的是
window
。是否仅当声明obj.func()时才执行自调用函数。@patz它与提升无关。你对上下文的理解不适合js…但也许可以解释为什么它是
window
。@AndrewLi刚刚添加了一行解释为什么。问题更多的是关于自调用函数。自调用函数是否被提升到myObject的外部/上方。@patz IILife涉及一个函数表达式,因此它没有被提升。但也许可以解释为什么它是
窗口
。。@AndrewLi刚刚添加了一行解释原因。问题更多地是关于自调用函数。自调用函数是否被提升到myObject的外部/上方。@patz IIFE涉及函数expr