首页 新闻 会员 周边

javascript 实例化对象问题

0
悬赏园豆:20 [已解决问题] 解决于 2016-11-01 09:59

<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是如何取到的?

yamybl的主页 yamybl | 初学一级 | 园豆:77
提问于:2016-10-31 16:29
< >
分享
最佳答案
0

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

收获园豆:20
授之以渔 | 小虾三级 |园豆:1107 | 2016-10-31 17:14

我也感觉是闭包,但不太肯定,谢了谢了

yamybl | 园豆:77 (初学一级) | 2016-10-31 17:20
其他回答(2)
0

没看懂问题

JackWang-CUMT | 园豆:2866 (老鸟四级) | 2016-10-31 17:11

js新手,问题问的可能不太明朗,但还是谢谢你的回复

支持(0) 反对(0) yamybl | 园豆:77 (初学一级) | 2016-11-01 09:59
0

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

如果换成这样

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

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

张云山 | 园豆:642 (小虾三级) | 2016-11-01 09:14

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

支持(0) 反对(0) 张云山 | 园豆:642 (小虾三级) | 2016-11-01 09:15

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

支持(0) 反对(0) yamybl | 园豆:77 (初学一级) | 2016-11-01 09:45
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册