文章目录
跟着纪老师的安排走,我们已经初学了HTML和CSS,现在正在学JavaScript,预计三周时间,在学习过程中也遇到了一些问题,和大家一一分享~~
问题一、根据下面代码说明:undefined是如何分配空间的?
<!DOCTYPE html>
<html>
<body>
<p>添加具有高索引的元素可以在数组中创建未定义的“孔”。</p>
<p id="demo"></p>
<script>
var fruits, text, fLen, i;
fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits[6] = "Lemon";
fLen = fruits.length;
text = "";
for (i = 0; i < fLen; i++) {
text += fruits[i] + "<br>";
}
document.getElementById("demo").innerHTML = text;
</script>
</body>
</html>
运行结果为:
undefined 这个变量从根本上就没有定义,而且它的原始类型是undefined,它显示在界面上只是占位的,当试图访问一个不存在的对象属性或数组项时,就会返回一个undefined值,所以索引为5和6指向的元素是不会分配内存的。
JavaScript语言是弱类型的语言,数组内存空间是不连续的,数组加元素的时候可以自动扩容。
问题二:为什么创建出来的时间和预想的时间不同?
使用 new Date(milliseconds),创建一个零时(January 1, 1970, 00:00:00 Universal Time)加毫秒的新日期对象,代码如下:
<!DOCTYPE html>
<html>
<body>
<p id="demo"></p>
<script>
var d = new Date(0);
document.getElementById("demo").innerHTML = d;
</script>
</body>
</html>
显示结果:
是因为电脑上设置的时区不同,显示的时间也不同,当把时间区域设置成为夏威夷时显示结果为:
在这里又引发出来一个问题,为什么new Date(0)显示的日期是1970年1月1日,1970有什么特殊的含义吗?
链接: 1970年1月1日那天,发生了什么?最伟大的变化是电脑的CPU和配合的计算机操作系统由32位向64的转变。
问题三:NaN 会在什么样的情况下出现呢?列举出现这种情况的代码
typeof Number(undefined));//NaN
typeof Number([1,2]));//NaN
typeof Number({}));//NaN
typeof Number(10abc));//NaN
问题四:不正确的引用 this
随着JavaScript编码技术和设计模式多年来变得越来越复杂,回调和闭包中的自引用作用域也相应增加,这是造成JavaScript问题的 "this/that 混乱 "的一个相当普遍的来源。
考虑下面代码:
Game.prototype.restart = function () {
this.clearLocalStorage();
this.timer = setTimeout(function() {
this.clearBoard(); // What is "this"?
}, 0);
};
执行上述代码会出现以下错误:
Uncaught TypeError: undefined is not a function
上述错误的原因是,当调用 setTimeout()时,实际上是在调用 window.setTimeout()。因此,传递给setTimeout()的匿名函数是在window对象的上下文中定义的,它没有clearBoard()方法。
传统的、符合老式浏览器的解决方案是将 this 引用保存在一个变量中,然后可以被闭包继承,如下所示:
Game.prototype.restart = function () {
this.clearLocalStorage();
var self = this; // Save reference to 'this', while it's still this!
this.timer = setTimeout(function(){
self.clearBoard(); // Oh OK, I do know who 'self' is!
}, 0);
};
另外,在较新的浏览器中,可以使用bind()方法来传入适当的引用:
Game.prototype.restart = function () {
this.clearLocalStorage();
this.timer = setTimeout(this.reset.bind(this), 0); // Bind to 'this'
};
Game.prototype.reset = function(){
this.clearBoard(); // Ahhh, back in the context of the right 'this'!
};
总结
不断的遇见问题,不断的去解决问题。认真对待问题,以后再次遇到该问题时它已不再是坑而是垫脚石。