为了账号安全,请及时绑定邮箱和手机立即绑定

javascript 实例化对象问题

javascript 实例化对象问题

小怪兽爱吃肉 2018-12-07 07:15:12
<html> <head> <script>window.onload = function () {    new Click("btn");}; function Click(id) {    var _this = this;    this.oBtn = document.getElementById(id);    this.oBtn.onclick = function () {        _this.sayHello();    };} Click.prototype.sayHello = function () {    alert("Hello World!");};</script></head> <body><input id="btn" type="button" value="button" /></body></html>  问题是实例化对象后即new Click("btn")之后,构造函数中的私有静态变量_this是如何取到的?
查看完整描述

6 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

这就是js中典型的闭包。_this是局部变量,但是function () {
        _this.sayHello();
    };这个函数是可以访问到这个变量的。我们如果想办法把这个函数在外面调用。就像上面的作为了button的onclick事件的响应函数,或者我们定义一个全局变量,然后把这个函数赋值给它。这个函数和它访问的局部变量就成了一个整体,也就可以访问这个局部变量了。

查看完整回答
反对 回复 2018-12-24
?
芜湖不芜

TA贡献1796条经验 获得超7个赞

没看懂问题

查看完整回答
反对 回复 2018-12-24
?
MYYA

TA贡献1868条经验 获得超4个赞

不是闭包问题,只是变量域问题,因为你所声明的_this变量虽然是局部变量,但它的作用域里面能然包含onclick事件。所以自然就能取到了。

如果换成这样

function Click(id) {
this.oBtn.onclick = function () {
_this.sayHello();
};
var _this = this;
this.oBtn = document.getElementById(id);
}

你就会发现他是不执行的。因为就是_this作用域发生了改变。

查看完整回答
反对 回复 2018-12-24
?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

b并且会报错,因为这也不是正常的写法,我只是举例给你看而已。

查看完整回答
反对 回复 2018-12-24
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

谢谢回复,你把_this变量声明在了_this.sayHello()语句之前,自然是取不到值的。在你调用_this.sayHello()时,_this还未被赋值,它的值为undefined,自然就会报错。

查看完整回答
反对 回复 2018-12-24
  • 6 回答
  • 0 关注
  • 536 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信