为什么以下内容不会返回`a和b'?
$("#linkid").trigger('click');
答案 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在浏览器中运行,则每个对象都从全局Object
或window
扩展。
其次你试图通过使用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);