2015-07-28 43 views
1

我最近开始学习JavaScript,同时做一些实验用的代码停留在此代码:了解内部函数在Javascript

var k = { 
    ab: "hi", 
    func: function() { 
     console.log("inner1" + this.ab); 
     (function() { 
      console.log("inner2 " + this.ab) 
     }()) 
    } 
}; 
k.func(); 

此代码给我结果“inner1喜”和“inner2未定义”。

我不明白为什么它的undefined在第二个console.log

+2

函数内部(..()),被称为IIFE,具有窗口环境(这一点),但你并没有在窗口对象定义AB – Evgeniy

回答

7

函数的this在您调用时会被绑定,具体取决于您如何调用它。将其称为值而不是属性 - (expression)()而不是object.method() - 将导致在严格模式下将this设置为全局对象或undefined

函数对象有两种方法调用带明确指定的函数thiscallapply。你可以在这里使用前者。

(function() { 
    console.log("inner2 " + this.ab); 
}.call(this));

,它将推动调用函数的this到内部功能。

或者,您可以将this分配给一个变量。

var that = this; 

(function() { 
    console.log("inner2 " + that.ab); 
}());
+0

感谢的答案,这是真的很有帮助。 –

2
var k = { 
    ab: "hi", 
    func: function() { 
     console.log(this,"inner1" + this.ab); 
     (function() { 
      console.log(this,"inner2 " + this.ab) 
     }()) 
    } 
}; 
k.func(); 

执行匿名函数改变情况下,坚持上下文做:

var k = { 
    ab: "hi", 
    func: function() { 
     console.log("inner1" + this.ab); 
     (function() { 
      console.log("inner2 " + this.ab) 
     }.bind(this).call()) 
    } 
}; 
k.func(); 
+0

不传递任何东西来调用有点多余;你可以做'.bind(this)()'。 (如果是为了清楚起见...也许将它分配给某些东西) – Ryan

+0

@minitech我每天都会学到新的东西 – Isaac

1

您不必在第二个功能使用this任何引用。相反,您可以使用:

(function() { 
    console.log("inner2 " + this.ab) 
}.call(this)) 
2

@minitech和@Issac很好地解释了问题和解决方案。另一种在任何层面获得财产的方法都是客观的。在你的代码是:

var k = { 
    ab: "hi", 
    func: function() { 
     console.log("inner1" + this.ab); 
     (function() { 
      console.log("inner2 " + k.ab) 
     }()) 
    } 
}; 

k.func(); 
1

在你的榜样“这”指基于范围两回事。你可以玩这个示例代码。也许它会帮助你理解基础知识。

var k = { 
    ab: "hi", 
    func: function() { 
     var me = this; // save 'meaning of this' in variable me. 
     console.log("inner1" + this.ab); 
     (function() { 
      console.log("inner2 " + me.ab) 
     }()) 
    } 
}; 
k.func();