NodeJS对象内的匿名函数

时间:2016-02-04 08:20:16

标签: javascript node.js

为什么以下内容不会返回`a和b'?

$("#linkid").trigger('click');

2 个答案:

答案 0 :(得分:1)

  

(function(){ return this.a + ' and b'; })()正在全局范围内执行(这是指浏览器中的窗口),在您的情况下,全局上下文没有属性a,因此未定义。

更简单的解决方案是使用function expression作为b的值,因此Staff.config.b()将返回预期的输出。

var Staff = {};
Staff.config = {
  a: 'a constant',
  b: function() {
    return this.a + ' and b';
  }
};
alert(Staff.config.b());

  

您可以使用获取特定属性

的值的getter来实现相同的目标

试试这个:

var Staff = {};
Staff.config = {
  a: 'a constant',
  get b() {
    return this.a + ' and b';
  }
};
alert(Staff.config.b);

答案 1 :(得分:0)

您获得未定义的原因与对象属性的提升位置有关。首先,您尝试引用尚未在内存中分配的对象属性,因此Javascript无法指向内存地址,因为该内存地址尚未分配。这就是你在

上得到一个未定义的原因
return this.a + ' and b';

此处this引用window对象,该对象是一个全局对象。在Javascript中,如果Javascript在浏览器中运行,则每个对象都从全局Objectwindow扩展。

其次你试图通过使用Self Invoking method来调用一个函数,但这总是在它自己的范围内运行,这意味着你不能访问它自己范围之外的变量,至少如果你不包装这是它自己的背景。类似的东西:

(function(closer) {
//...
})(scope)

这就是所谓的闭包。

回到你原来的问题。如果以下面的方式构造对象,它将起作用。这是因为您指的是已经实例化的对象的属性。

var Staff = Staff || {};

Staff.config = function() {
  this.a = "a constant";
  this.b = this.a + " and b";    
}

var staff = new Staff.config();
console.log(staff);