我确信这是一个基本问题。我正在创建一个自定义的JavaScript类,并在顶部使用Jquery来做一些事情。在检查文档是否准备好之后,我调用init()并添加事件处理程序。然而,当我按一下按钮,我进去“turnLightOn”功能,但是当它试图调用另一个函数该类这个范围已更改为“按钮”,所以我得到按钮被按下时,Javascript简单的类范围发生变化
Object #<HTMLButtonElement> has no method 'getDataFromServer'
我知道这是一个简单的问题,但任何人都可以指出正确的答案吗?
<div id="cp">
<ul>
<li><button id="light_switch">Light On</button></li>
</ul>
</div>
<div id="room">
</div>
<script type="text/javascript">
var CP = function(widget, light_switch){
this.widget_name = widget;
this.light_switch = light_switch;
var self = this;
console.log(this);
};
CP.prototype.init = function(){
$("#"+this.light_switch).on('click', this.turnlighton);
};
CP.prototype.somecallback = function(){
console.log(this);
};
CP.prototype.turnlighton = function(){
this.getDataFromServer(somecallback);
};
CP.prototype.getDataFromServer = function(callback){
$.ajax({url:"/"+fname,
success:function(result){
callback(result);
}
});
};
$(document).ready(function(){
var c = new CP("control_panel", "light_switch");
c.init();
}
);
</script>
这个工作。所以,这是因为“this”关键字具有的特殊环境。有没有比使用代理或绑定更好的方法来处理这个问题?其实你可以举一个例子吗? – user1647708
@ user1647708在给定的场景我没有看到另一种方式,但只是用另一种方式使用闭包变量 - http://jsfiddle.net/arunpjohny/8aD9U/4/ –
感谢演示。你看到在这个范围内需要两个“var self”的必要性吗? – user1647708