放下对象
要理解 JavaScript,你得首先放下对象和类的概念,回到数据和代码的本原。编程世界只有数据和代码两种基本元素,而这两种元素又有着纠缠不清的关系。JavaScript 就是把数据和代码都简化到最原始的程度。
所谓“对象化”,就是可以将数据和代码组织成复杂结构的能力。JavaScript 中只有 object 类型和 function 类型提供了对象化的能力。
JavaScript 中只有 object 类型和 function 类型提供了对象化的能力。
执行顺序
情景分析
情景1
var myfunc = function ()
{
alert("hello");
};
myfunc(); //第一次调用 myfunc,输出 hello
myfunc = function ()
{
alert("yeah");
};
myfunc(); //第二次调用 myfunc,将输出 yeah
情景2
function myfunc ()
{
alert("hello");
};
myfunc(); //这里调用 myfunc,输出 yeah 而不是 hello
function myfunc ()
{
alert("yeah");
};
myfunc(); //这里调用 myfunc,当然输出 yeah
JavaScript 执行引擎并非一行一行地分析和执行程序,而是一段一段地分析执行的。
而且,在同一段程序的分析执行中,定义式的函数语句会被提取出来优先执行。
函数定义执行完之后,才会按顺序执行其他语句代码。
也就是说,在第一次调用 myfunc 之前,第一个函数语句定义的代码逻辑,已被第二个函数定义语句覆盖了。所以,两次都调用都是执行最后一个函数逻辑了。
一段代码中的定义式函数语句会优先执行,这似乎有点象静态语言的编译概念。所以,这一特征也被有些人称为:JavaScript 的“预编译”。
技术点
特性
通常来说,浏览器对于Javascript的运行有两大特性:
1)载入后马上执行,
2)执行时会阻塞页面后续的内容(包括页面的渲染、其它资源的下载)。于是,如果有多个js文件被引入,那么对于浏览器来说,这些js文件被被串行地载入,并依次执行。
因为javascript可能会来操作HTML文档的DOM树,所以,浏览器一般都不会像并行下载css文件并行下载js文件,因为这是js文件的特殊性造成的。所以,如果你的javascript想操作后面的DOM元素,基本上来说,浏览器都会报错说对象找不到。因为Javascript执行时,后面的HTML被阻塞住了,DOM树时还没有后面的DOM结点。所以程序也就报错了。
1. 加载顺序:引入标记script的出现顺序
页面上的Javascript代码是HTML文档的一部分,所以Javascript在页面装载时执行的顺序就是其引入标记
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题 3</title>
<script>
alert("1-最先执行");
</script>
</head>
<body onload="alert('3-最后执行');">
<script>
alert("2-接着执行");
</script>
</body>
</html>
基本概念
函数-function
定义式函数
function myfunc()
{
alert("hello");
};
变量式函数
var myfunc=function myfunc()
{
alert("hello");
};