JS作用域中对象文字中的未定义变量
Undefined variable in the JS Scope in a object literal
我有以下代码(http://jsbin.com/disofaji/1/):
var test = {
person: "nick",
init: function() {
$('#foo').click(function() {
// how to access the person?
console.log(this.person);
});
},
};
test.init();
问题是,我得到了输出undefined
,我想知道如何在我的点击处理程序中访问person
。
注意:点击处理程序只是我的问题的一个例子,我也有它在其他上下文中
这是因为在点击处理程序中,This实际上指的是触发事件的控件。
我已经更新了你的代码,它工作了。以下是你需要做的
var test = {
person: "nick",
init: function() {
var obj = this;
$('#foo').click(function() {
// how to access the person?
alert("inside");
console.log(obj.person);
});
},
};
test.init();
有一个众所周知的"技巧"来保留对函数原始作用域的引用:
init: function() {
var self = this;
$( '#foo' ).click( function() {
console.log( self.person );
} );
},
基本上,您需要将this
变量"缓存"到另一个变量中(在本例中称为self
)。然后,在单击处理程序内部,您可以访问self
变量,就像它是单击处理程序外部的this
变量一样。
另一个选择是简单地使用骨干的事件委托:
var test = {
events: {
"click #foo": "foo_click_handler"
}
person: "nick",
foo_click_handler: function() {
// callback is bound to the view scope, so "this" can be used normally.
console.log( this.person );
},
};
From the docs:
所有附加的回调在交给jQuery之前都绑定到视图,所以当回调被调用时,
this
继续引用视图对象。
代替使用var self = this;
ie。保存对对象或其他事件库的引用,我会使用bind()(包含在JavaScript标准库中),这将使您的代码更简洁,更模块化。
bind所做的是将函数logperson
绑定到你传递给它的对象上,在我们的例子中是this
。
这确实使您不必使用匿名函数,但就我个人而言,匿名函数总是更好的。
var logperson = function() {
console.log(this.person);
};
var test = {
person: "nick",
init: function() {
$('#foo').click(logperson.bind(this));
};
};
相关文章:
- Socket.IO未定义变量
- 更改 Javascript 对象中所有未定义变量的值
- coffeescript,类未定义变量
- 使用下划线未定义变量时发生抛出/捕获错误
- 网络浏览器正在成为“;严格的“;用于Javascript中未定义变量的操作
- 使用window.location时未定义变量
- 传递给数据的未定义变量
- bizzare未定义变量
- JavaScript 中全局范围内存在未定义变量的原因是什么?
- JavaScript onClick 参数表示未定义变量
- 在指令中使用 $scope.$watch 处理未定义变量的替代方法
- 对于循环错误:未捕获的引用错误,未定义变量.怎么了
- JavaScript / YouTube API - 未定义变量 YT
- 未捕获的引用错误:在测试真实性时未定义变量
- 通过使用JavaScript“未定义”(变量),我们可以释放系统内存
- 与未定义变量相关的错误
- Angularjs 控制器中的未定义变量
- 角度解析:未定义变量
- BackboneJS Uncaught ReferenceError:未定义变量
- 使用Underscore JS部分和for循环的未定义变量对象