请问老师关于这个疑问
function createLoginLayer() {
var loginLayer = document.createElement('div');
loginLayer.id = 'loginLayer';
loginLayer.innerHTML = '登录窗口';
loginLayer.style.display = 'none';
document.body.appendChild(loginLayer);
return loginLayer;
}
function createMaskLayer() {
var maskLayer = document.createElement('div');
maskLayer.id = 'maskLayer';
maskLayer.style.display = 'none';
document.body.appendChild(maskLayer);
return maskLayer;
}
function getSingleton(fn) {
var instance = null;
return function () {
return instance || (instance = fn.apply(null, arguments));
};
}
var createSingletonLoginLayer = getSingleton(createLoginLayer);
var createSingletonMaskLayer = getSingleton(createMaskLayer);
document.getElementById('loginBtn').onclick = function () {
var loginLayer = createSingletonLoginLayer();
var maskLayer = createSingletonMaskLayer();
// loginLayer.style.display = 'block';
// maskLayer.style.display = 'block';
};老师我有疑问
想请问一下当点击登录按钮的时候首先执行了var loginLayer = createSingletonLoginLayer();,在执行var maskLayer = createSingletonMaskLayer();的时候不是又将instance的值更改了吗?
当我关闭在点击登录的时候此时var loginLayer = createSingletonLoginLayer();中instance的值是什么?会被createSingletonMaskLayer()影响吗?
正在回答
其实你现在不明白的就是这两段代码的区别,这里面涉及到的就是引用类型的赋值问题。
1、第一段代码因为传入的参数不同,所以返回来的instance值就是不同的,可以看成是两个不同的对象,因为即使是两个空对象,{}和{},也是不相等的。
2、第二段代码,两个赋值都是同一个this,并且都是赋值给了instance变量,也就是变量指向了同一个this地址,然后返回了这个instance变量。相当于:

自己再理解下,建议看看引用类型赋值相关的问题哦。
function createLoginLayer() {
var loginLayer = document.createElement('div');
loginLayer.id = 'loginLayer';
loginLayer.innerHTML = '登录窗口';
loginLayer.style.display = 'none';
document.body.appendChild(loginLayer);
return loginLayer;
}
function createMaskLayer() {
var maskLayer = document.createElement('div');
maskLayer.id = 'maskLayer';
maskLayer.style.display = 'none';
document.body.appendChild(maskLayer);
return maskLayer;
}
function getSingleton(fn) {
var instance = null;
return function () {
return instance || (instance = fn.apply(null, arguments));
};
}
var createSingletonLoginLayer = getSingleton(createLoginLayer);
var createSingletonMaskLayer = getSingleton(createMaskLayer);
document.getElementById('loginBtn').onclick = function () {
var loginLayer = createSingletonLoginLayer();
console.log(loginLayer);
var maskLayer = createSingletonMaskLayer();
这段代码,因为 createSingletonLoginLayer和createSingletonMaskLayer 都分别调用了getSingleton创建了两个不同的作用域所以他们闭包返回的instance值是独立的,互相不牵扯的。
而<body>
<script type="text/javascript">
var Person = (function() {
var instance=null;
return function() {
if(instance) return instance;
this.name = 'zhangsan';
this.id = Math.random();
instance=this;
}
})();
var Person1 = new Person();
console.log(Person1);
var Person2 = new Person();
console.log(Person2);
console.log(Person1 == Person2);一个地址?
</script>
</body>
</html>
这段代码返回true的原因是,函数 Person一开始就进行了自执行闭包丢出了一个匿名函数可以访问到instance的值。因为person1和person2的实例化都是在执行闭包return出来的函数,并没有重新执行Person这个函数所以instance相对于他们两个person是都可以访问的到的一个变量,所以他们仍然公用一个instance的值是这个意思吗请问如果说是互相影响为什么多次点击的时候instance的值应该已经变成了新创建的maskLayer但是事实却没有
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script type="text/javascript">
var Person = (function() {
var instance=null;
return function() {
if(instance) return instance;
this.name = 'zhangsan';
this.id = Math.random();
instance=this;
}
})();
var Person1 = new Person();
var Person2 = new Person();
console.log(Person1 == Person2);
</script>
</body>
</html>如果说createSingletonLoginLayer函数中的instance和createSingletonMaskLayer中的instance的值没有任何关系 是各自保存的局部作用域中的instance,那么这段代码怎么解释?为什么person1和
person2两个不同实例化的函数为什么会访问到同一个instance??
- 参与学习 人
- 提交作业 467 份
- 解答问题 4826 个
本路径带你通过系统学习HTML5、JavaScript、jQuery的进阶知识,不仅如此,还会学习如何利用组件化的思想来开发网页,知识点+案例,使得所学可以更好的得到实践。
了解课程


恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星