javascript在自我调用函数中提升

时间:2017-04-15 17:43:37

标签: javascript

我知道在编译阶段会提升吊装,变量和功能的一般规则。 因此,任何写作如下

var foo = 'global';

将编译为,

var foo; //undefined
foo = 'global'; // declared

但这是我无法理解的

var foo = 'global';
var myObject = {
 foo: 'local',
 func: function(){
  console.log(this.foo); // local
  (function(){ 
     console.log(this.foo); // global
  })();
 }
}
myObject.func();

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

一般来说,我想要了解的是它在哪里被提升。

2 个答案:

答案 0 :(得分:1)

在致电console.log(this);之前添加console.log(this.foo),您会看到this基本上只是window。这就是您获得全球foo

的原因

函数中this的默认值是"全局对象"直接调用时;在浏览器中,全局对象为window。在这种情况下,您也会看到window

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

由于您已经定义了一个函数表达式并且已经立即调用它,它实际上是直接调用该函数(类似于直接调用常规函数的方式)。

答案 1 :(得分:1)

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

无论您在函数外部(或在没有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不在“同一级别”,因此默认情况下其调用conext是全局对象。

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

var self = this

所以代码如下:

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

2

  

问题更多的是关于自我调用功能。是在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);
}