网页JavaScript基础笔记

JavaScript 是一种脚本语言。
JavaScript,通常缩写为 JS,是一种高级的,解释执行的编程语言。JavaScript 是一门基于原型、函数先行的语言,是一门多范式的语言,它支持面向对象编程,命令式编程,以及函数式编程。它提供语法来操控文本、数组、日期以及正则表达式等,不支持 I/O,比如网络、存储和图形等,但这些都可以由它的宿主环境提供支持。它已经由 ECMA(欧洲计算机制造商协会)通过 ECMAScript 实现语言的标准化。它被世界上的绝大多数网站所使用,也被世界主流浏览器(Chrome、IE、Firefox、Safari、Opera)支持。

虽然 JavaScript 与 Java 这门语言不管是在名字上,或是在语法上都有很多相似性,但这两门编程语言从设计之初就有很大的不同,JavaScript 的语言设计主要受到了 Self(一种基于原型的编程语言)和 Scheme(一门函数式编程语言)的影响。在语法结构上它又与 C 语言有很多相似,例如 if 条件语句、while 循环、switch 语句、do-while 循环等。

在客户端,JavaScript 在传统意义上被实现为一种解释语言,但在最近,它已经可以被即时编译(JIT)执行。随着最新的 HTML5 和 CSS3 语言标准的推行,它还可用于游戏、桌面和移动应用程序的开发和在服务器端网络环境运行,如 Node.js。

JavaScript 的组成
ECMAScript:JavaScript 的语法标准。
DOM:JavaScript 操作网页上的元素的 API。
BOM:JavaScript 操作浏览器的部分功能的 API。
JavaScript 的特点
可以使用任何文本编辑工具编写,然后使用浏览器就可以执行程序。
是一种解释型脚本语言:代码不进行预编译,从上往下逐行执行,不需要进行严格的变量声明。
主要用来向 HTML 页面添加交互行为。

JavaScript引入

<script src=""></script>
<script>
</script>

变量

声明变量

var js="123";

变量的命名规则:

  1. 变量名必须以字母、下划线 “_”、美元符号 “$” 开头,不能以数字开头。
  2. 变量可以包含字母、数字、下划线和美元符号。
  3. 不能使用 JavaScript 中的关键字做为变量名。
  4. 变量名不能有空格。
  5. 变量名对大小写敏感,比如:name 和 Name 就是两个完全不同的变量。

变量类型
Number:你可以在变量中存储数字,不论这些数字是 10(整数),或者是 3.1415926(浮点数)。

var j=1;

**String:**存储字符(比如 “shiyanlou”)的变量,字符串可以是引号中的任意文本,可以使用单引号或双引号,也可以在字符串中使用引号,只要不匹配包围字符串的引号即可。

var j="study js";

Boolean:
布尔类型的值有两种:true 和 false。通常被用于在适当的代码之后,测试条件是否成立。
**Array:**数组是一个单个对象,其中包含很多值,方括号括起来,并用逗号分隔。

var htmlarry= ["html", "css", "Js"];
var c = [12, 15, 20];

**Object:**对象类型。

var student = { name: "Tom", age: 18 };

动态类型
JavaScript 是一种 “动态类型语言”,这意味着不同于其他一些语言(如 C、Java),你不需要指定变量将包含什么数据类型(例如 number 或 string),全部用 var 关键字声明就是了。
注释
单行注释:用来描述下面一个或多行代码的作用。单行注释快捷键:Ctrl + /。
多行注释:用来注释多条代码。多行注释快捷键:Ctrl + Shift + /。

数组

操作数组
修改数组
修改数组中的元素内容也很简单,直接为它提供新值就可以了。
获取数组长度
同样的我们使用 length 来获取数组的长度。
数组和字符串之间的转换
通过 split() 方法,将字符串转换为数组。
相反的通过 join() 方法将数组转换为字符串。
注:同样可以使用 toString() 方法将数组转换为字符串,但是 join() 方法可以指定不同的分隔符,而 toString() 方法只能是逗号。
添加和删除数组项
在数组尾部添加一个或多个元素,使用 push() 方法。
使用 pop() 方法将删除数组的最后一个元素,把数组长度减 1,并且返回它删除的元素的值。如果数组已经为空,则 pop() 不改变数组,然后返回 undefined 值。
unshift() 和 shift() 从功能上与 push() 和 pop() 完全相同,只是它们分别作用于数组的开始,而不是结尾。

转换成数值类型
Number() 可以把任意值转换成数值,如果要转换的字符串中有一个不是数值的字符,返回 NaN(not a number)。
parseInt() 把字符串转换成整数。
parseFloat() 把字符串转换成浮点数。写法和 parseInt() 相似,主要有以下几个不同点:

  1. parseFloat 不支持第二个参数,只能解析 10 进制数。
  2. 如果解析的内容里只有整数,解析成整数。

使用 Boolean() 函数转换成布尔类型。

函数

创建函数
函数声明创建函数

function functionName(parameters) {
  // 执行的代码
}

函数表达式创建函数

var functionName = function(parameters) {
  // 执行的代码
};

函数的参数
形参:function f(a, b){return a + b;} // a, b 是形参,占位用,函数定义时形参无值。
实参:当我们调用上面的函数时比如 f(2, 3);其中 2 和 3 就是实参,会传递给 a 和 b,最后函数中执行的语句就变成了:return 2 + 3;。
注:在 JavaScript 中,实参个数和形参个数可以不相等。
在 JavaScript 中没有重载
在 JavaScript 中函数的返回值

  1. 如果函数中没有 return 语句,那么函数默认的返回值是:undefined。
  2. 如果函数中有 return 语句,那么跟着 return 后面的值就是函数的返回值。
  3. 如果函数中有 return 语句,但是 return 后面没有任何值,那么函数的返回值也是:undefined。
  4. 函数在执行 return 语句后会停止并立即退出,也就是说 return 语句执行之后,剩下的代码都不会再执行了。
  5. 当函数外部需要使用函数内部的值的时候,我们不能直接给予,需要通过 return 返回。

匿名函数
匿名函数就是没有命名的函数,一般用在绑定事件的时候。

function(){
    // 执行的代码
}

自调用函数
匿名函数不能通过直接调用来执行,因此可以通过匿名函数的自调用的方式来执行。

(function() {
})();

对象

JavaScript 中所有事物都是对象:字符串,数组,日期等等。我们甚至可以自己创建对象,将相关的函数和变量封装打包成便捷的数据容器。另外值得注意的是 JavaScript 是一门基于对象的语言。

在 JavaScript 中对象是拥有属性和方法的数据。
属性和方法
属性是与对象相关的值,也可以理解为特征。方法是能够在对象上执行的动作,也可以理解为行为。

JSON

JSON(JavaScript Object Notation,JavaScript 对象表示法)是一种由道格拉斯·克罗克福特构想和设计、轻量级的数据交换语言,该语言以易于让人阅读的文字为基础,用来传输由属性值或者序列性的值组成的数据对象。尽管 JSON 是 JavaScript 的一个子集,但 JSON 是独立于语言的文本格式,并且采用了类似于 C 语言家族的一些习惯。

JSON 数据格式与语言无关,脱胎于 JavaScript,但当前很多编程语言都支持 JSON 格式数据的生成和解析。JSON 的官方 MIME 类型是 application/json,文件扩展名是 .json。

JSON实例

{
  "name": "zhangsan",
  "age": 18,
  "gender": "male"
}
{
  "students": [
    { "firstName": "san", "lastName": "zhang" },
    { "firstName": "si", "lastName": "li" },
    { "firstName": "wu", "lastName": "wang" }
  ]
}

注意:

  1. JSON 是一种纯数据格式,它只包含属性,没有方法。
  2. JSON 的属性必须通过双引号引起来。
  3. JSON 要求两头有 {} 来使其合法。
  4. 可以把 JavaScript 对象原原本本的写入 JSON 数据,比如:字符串,数字,数组,布尔还有其它的字面值对象。

常用内置对象

Array 对象
Array 对象的常用属性:length,获取数组的长度。
Array 对象的常用方法:
concat() 用于连接两个或多个数组,并返回结果。
join() 将数组转换成字符串。
pop() 删除并返回数组的最后一个元素。
push() 向数组的末尾添加一个或更多元素,并返回新的长度。
reverse() 颠倒数组的顺序。
shift() 删除并返回数组的第一个元素。
unshift() 向数组的开头添加一个或更多元素,并返回新的长度。
slice() 从某个已有的数组返回选定的元素。
splice() 删除或替换当前数组的某些项目。
toString() 把数组转换为字符串,并返回结果。

String 对象
String 对象的常用属性:length,获取字符串的长度。
String 对象的常用方法:
charAt() 获取指定位置处字符。
charCodeAt() 获取指定位置处字符的 Unicode 编码。语法为:
concat() 连接字符串,等效于 “+”,“+” 更常用。与数组中的 concat() 方法相似。
slice() 提取字符串的片断,并在新的字符串中返回被提取的部分。
indexOf() 检索字符串。
toString() 返回字符串。
toLowerCase() 把字符串转换为小写。
toUpperCase() 把字符串转换为大写。
replace() 替换字符串中的某部分。
split() 把字符串分割为字符串数组。

Date 对象
Date 对象方法:
Date(): 返回当日的日期和时间(输出的是中国标准时间)。
getDate(): 从 Date 对象返回一个月中的某一天 (1 ~ 31)。
getDay(): 从 Date 对象返回一周中的某一天 (0 ~ 6)。
getMonth(): 从 Date 对象返回月份 (0 ~ 11)。
getFullYear(): 从 Date 对象以四位数字返回年份。
getHours(): 返回 Date 对象的小时 (0 ~ 23)。
getMinutes(): 返回 Date 对象的分钟 (0 ~ 59)。
getSeconds(): 返回 Date 对象的秒数 (0 ~ 59)。
getMilliseconds(): 返回 Date 对象的毫秒(0 ~ 999)。

Math 对象
Math 对象的常用属性:
E :返回常数 e (2.718281828…)。
LN2 :返回 2 的自然对数 (ln 2)。
LN10 :返回 10 的自然对数 (ln 10)。
LOG2E :返回以 2 为底的 e 的对数 (log2e)。
LOG10E :返回以 10 为底的 e 的对数 (log10e)。
PI :返回 π(3.1415926535…)。
SQRT1_2 :返回 1/2 的平方根。
SQRT2 :返回 2 的平方根。
Math 对象的常用方法:
abs(x) :返回 x 的绝对值。
round(x) :返回 x 四舍五入后的值。
sqrt(x) :返回 x 的平方根。
ceil(x) :返回大于等于 x 的最小整数。
floor(x) :返回小于等于 x 的最大整数。
sin(x) :返回 x 的正弦。
cos(x) :返回 x 的余弦。
tan(x) :返回 x 的正切。
acos(x) :返回 x 的反余弦值(余弦值等于 x 的角度),用弧度表示。
asin(x) :返回 x 的反正弦值。
atan(x) :返回 x 的反正切值。
exp(x) :返回 e 的 x 次幂 (e^x)。
pow(n, m) :返回 n 的 m 次幂 (nm)。
log(x) :返回 x 的自然对数 (ln x)。
max(a, b) :返回 a, b 中较大的数。
min(a, b) :返回 a, b 中较小的数。
random() :返回大于 0 小于 1 的一个随机数。

创建对象和访问对象

通过对象字面量来创建

var student = {
  name: "zhangsan",
  age: 18,
  gender: "male",
  sayHi: function() {
    console.log("hi,my name is " + this.name);
  }
};

通过 new Object() 创建对象

var student = new Object();
(student.name = "zhangsan"),
  (student.age = 18),
  (student.gender = "male"),
  (student.sayHi = function() {
    console.log("hi,my name is " + this.name);
  });

通过工厂函数创建对象

function createStudent(name, age, gender) {
  var student = new Object();
  student.name = name;
  student.age = age;
  student.gender = gender;
  student.sayHi = function() {
    console.log("hi,my name is " + this.name);
  };
  return student;
}
var s1 = createStudent("zhangsan", 18, "male");

自定义构造函数

function Student(name, age, gender) {
  this.name = name;
  this.age = age;
  this.gender = gender;
  this.sayHi = function() {
    console.log("hi,my name is " + this.name);
  };
}
var s1 = new Student("zhangsan", 18, "male");

new 关键字
构造函数,是一种特殊的函数。主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与 new 运算符一起使用在创建对象的语句中。这里有需要特别注意的几点:

  1. 构造函数用于创建一类对象,首字母要大写。
  2. 内部使用 this 关键字给对象添加成员。
  3. 使用 new 关键字调用对象构造函数。

this 详解
在 JavaScript 中,我们经常会使用到 this 关键字,那么 this 到底指向什么呢?这里有一个口诀:谁调用 this,它就是谁。

  1. 函数在定义的时候 this 是不确定的,只有在调用的时候才可以确定。
  2. 一般函数直接执行,内部 this 指向全局 window。
  3. 函数作为一个对象的方法,被该对象所调用,那么 this 指向的是该对象。
  4. 构造函数中的 this,始终是 new 的当前对象。

遍历对象的属性
通过 for…in 语句用于遍历数组或者对象的属性,对数组或者对象的属性进行循环操作。

删除对象的属性
使用 delete 删除对象的属性。

Web API

API
API(Application Programming Interface,应用程序编程接口):”计算机操作系统”(Operating system)或”程序库”提供给应用程序调用使用的代码。其主要目的是让应用程序开发人员得以调用一组例程功能,而无须考虑其底层的源代码为何、或理解其内部工作机制的细节。API 本身是抽象的,它仅定义了一个接口,而不涉及应用程序在实际实现过程中的具体操作。

Web API
Web API 是浏览器提供的一套操作浏览器功能和页面元素的 API(BOM 和 DOM)。

BOM简介
浏览器对象模型(Browser Object Model (BOM))指的是由 Web 浏览器暴露的所有对象组成的表示模型。BOM 与 DOM(Document Object Model,文档对象模型)不同,其既没有标准的实现,也没有严格的定义,所以浏览器厂商可以自由地实现 BOM。

作为显示文档的窗口,浏览器程序将其视为对象的分层集合。当浏览器分析文档时,它将创建一个对象的集合,以定义文档,并详细说明它应如何显示。浏览器创建的对象称为文档对象,它是浏览器使用的更大的对象集合的一部分。此浏览器对象集合统称为浏览器对象模型或 BOM。

BOM 层次结构的顶层是窗口对象,它包含有关显示文档的窗口的信息。某些窗口对象本身就是描述文档和相关信息的对象。

BOM 的顶级对象 window 以及常用操作方法
window 是浏览器的顶级对象,当调用 window 下的属性和方法时,可以省略 window。
对话框
alert():显示带有一段消息和一个确认按钮的警告框。
prompt():显示可提示用户输入的对话框。
confirm():显示带有一段消息以及确认按钮和取消按钮的对话框。
页面加载事件

  1. onload
window.onload = function() {
  // 当页面加载完成执行
  // 当页面完全加载所有内容(包括图像、脚本文件、CSS 文件等)执行
};
  1. unload
window.onunload = function() {
  // 当用户退出页面时执行
};

浏览器尺寸

var width = window.innerWidth;
document.documentElement.clientWidth;
document.body.clientWidth;
var height = window.innerHeight;
document.documentElement.clientHeight;
document.body.clientHeight;

定时器
setTimeout() 方法在指定的毫秒数到达之后执行指定的函数,只执行一次。clearTimeout() 方法取消由 setTimeout() 方法设置的 timeout。

// 创建一个定时器,2000毫秒后执行,返回定时器的标示
var timerId = setTimeout(function() {
  console.log("Hello");
}, 2000);

// 取消定时器的执行
clearTimeout(timerId);

setInterval() 方法设置定时调用的函数也就是可以按照给定的时间(单位毫秒)周期调用函数,clearInterval() 方法取消由 setInterval() 方法设置的 timeout。

// 创建一个定时器,每隔 2 秒调用一次
var timerId = setInterval(function() {
  var date = new Date();
  console.log(date.toLocaleTimeString());
}, 2000);

// 取消定时器的执行
clearInterval(timerId);

DOM 简介

文档对象模型(Document Object Model,简称 DOM),是 W3C 组织推荐的处理可扩展标志语言的标准编程接口。DOM 定义了访问 HTML 和 XML 文档的标准。

DOM HTML
DOM 能够操作 HTML 的内容。
改变 HTML 输出流
在 JavaScript 中,使用 document.write() 可用于直接向 HTML 输出流写内容。

document.write("新设置的内容<p>标签也可以生成</p>");

改变 HTML 内容
使用 innerHTML 属性改变 HTML 内容。
改变 HTML 属性

document.getElementById(id).attribute = new value();

DOM CSS
DOM 能够改变 HTML 元素的样式。

document.getElementById(id).style.property = new style();

DOM 节点
根据 W3C 的 HTML DOM 标准,HTML 文档中的所有内容都是节点:整个文档就是一个文档节点,而每一个 HMTL 标签都是一个元素节点。HTML 标签中的文本则是文本节点,HTML 标签的属性是属性节点,一切都是节点。
在这里插入图片描述
DOM 节点的操作
获取节点
要操作节点,首先我们要找到节点。主要有以下三种办法:

  1. 通过 ID 找到 HTML 元素:使用方法 getElementById() 通过元素的 ID 而选取元素,比如:
    document.getElementById(“demo”); // 假定已经有一个 ID 名为 demo 的标签,可以这样来获取它
    copy
  2. 通过标签名找到 HTML 元素:使用方法 getElementsByTagName() 来选取元素,如果有多个同类型标签,那么我们可以通过下标来确认。
  3. 通过类名来找到 HTML 元素:使用方法 getElementsByClassName() 通过元素的类名来选取元素。

DOM 节点直接的关系
DOM 的节点并不是孤立的,我们从 DOM 树中也可以看出,节点与节点之间存在着相对的关系,就如同一个家族一样,有父辈,有兄弟,有儿子等等。
在这里插入图片描述
需要注意以下几点:

  1. childNodes:它是标准属性,它返回指定元素的子元素集合,包括 HTML 节点,所有属性,文本节点。
  2. children:非标准属性,它返回指定元素的子元素集合。但它只返回 HTML 节点,甚至不返回文本节点。
  3. nextSibling 和 previousSibling 获取的是节点,获取元素对应的属性是 nextElementSibling 和 previousElementSibling。
  4. nextElementSibling 和 previousElementSibling 有兼容性问题,IE9 以后才支持。

DOM 节点的操作

创建节点
创建元素节点:使用 createElement() 方法。

var par = document.createElement("p");

创建属性节点:使用 createAttribute() 方法。
创建文本节点:使用 createTextNode() 方法。

插入子节点
appendChild () 方法向节点添加最后一个子节点。
insertBefore (插入的新的子节点,指定的子节点) 方法在指定的子节点前面插入新的子节点。如果第二个参数没写或者为 null,则默认插入到后面。

删除节点:使用 removeChild() 方法。

父节点.removeChild(子节点);
node.parentNode.removeChild(node); // 如果不知道父节点是什么,可以这样写

替换子节点:使用 replaceChild() 方法。

node.replaceChild(newnode, oldnode);

设置节点的属性:
获取:getAttribute(name)
设置:setAttribute(name, value)
删除:removeAttribute(name)

DOM 事件
事件的定义
在什么时候执行什么事。

事件三要素
事件由:事件源 + 事件类型 + 事件处理程序组成。
事件源:触发事件的元素。
事件类型:事件的触发方式(比如鼠标点击或键盘点击)。
事件处理程序:事件触发后要执行的代码(函数形式,匿名函数)。
常用的事件:
在这里插入图片描述
异常处理
异常捕获
使用 try-catch 语句开捕获异常。
需要注意以下几点:

  1. 语句 try 和 catch 是成对出现的。
  2. 如果在 try 中出现了错误,try 里面出现错误的语句后面的代码都不再执行,直接跳转到 catch 中 catch 处理错误信息,然后再执行后面的代码。
  3. 如果 try 中没有出现错误,则不会执行 catch 中的代码,执行完 try 中的代码后直接执行后面的代码。
  4. 通过 try-catch 语句进行异常捕获之后,代码将会继续执行,而不会中断。

throw 语句
通过 throw 语句,可以创建自定义错误。throw 语句常常和 try catch 语句一起使用。
原型
在 JavaScript 中,每一个函数都有一个 prototype 属性,指向另一个对象。这个对象的所有属性和方法,都会被构造函数的实例继承。
构造函数的 prototype 对象默认都有一个 constructor 属性,指向 prototype 对象所在函数。
通过构造函数得到的实例对象内部会包含一个指向构造函数的 prototype 对象的指针 protoproto 属性最早是火狐浏览器引入的,用以通过实例对象来访问原型,这个属性在早期是非标准的属性。
实例对象可以直接访问原型对象成员,所有实例都直接或间接继承了原型对象的成员。

原型链

属性搜索原则
属性搜索原则,也就是属性的查找顺序,在访问对象的成员的时候,会遵循以下原则:

  1. 首先从对象实例本身开始找,如果找到了这个属性或者方法,则返回。
  2. 如果对象实例本身没有找到,就从它的原型中去找,如果找到了,则返回。
  3. 如果对象实例的原型中也没找到,则从它的原型的原型中去找,如果找到了,则返回。
  4. 一直按着原型链查找下去,找到就返回,如果在原型链的末端还没有找到的话,那么如果查找的是属性则返回 undefined,如果查找的是方法则返回 xxx is not a function。

Object.prototype
在这里插入图片描述
call、apply、bind
call
call() 方法调用一个函数, 其具有一个指定的 this 值和分别地提供的参数(参数的列表)。

fun.call(thisArg, arg1, arg2, ...)

注:

  1. thisArg 指的是在 fun 函数中指定的 this 的值。如果指定了 null 或者 undefined 则内部 this 指向 window,同时值为原始值(数字,字符串,布尔值)的 this 会指向该原始值的自动包装对象。是一个可选项。
  2. arg1, arg2, …指定的参数列表。也是可选项。
  3. 使用调用者提供的 this 值和参数调用该函数的返回值。若该方法没有返回值,则返回 undefined。
  4. call() 允许为不同的对象分配和调用属于一个对象的函数/方法。
  5. call() 提供新的 this 值给当前调用的函数/方法。你可以使用 call() 来实现继承:写一个方法,然后让另外一个新的对象来继承它(而不是在新对象中再写一次这个方法)。

  1. 使用 call() 方法调用函数并且指定上下文的 this。前面的
  2. 在一个子构造函数中,你可以通过调用父构造函数的 call() 方法来实现继承

apply
apply() 方法与 call() 方法类似,唯一的区别是 call() 方法接受的是参数,apply() 方法接受的是数组。

fun.apply(thisArg, [argsArray]);
  1. 使用 apply() 方法将数组添加到另一个数组。
  2. 使用 apply() 方法和内置函数。

bind
bind() 方法创建一个新的函数(称为绑定函数),在调用时设置 this 关键字为提供的值。并在调用新函数时,将给定参数列表作为原函数的参数序列的前若干项。

fun.bind(thisArg[, arg1[, arg2[, ...]]])

注:参数 thisArg:当绑定函数被调用时,该参数会作为原函数运行时的 this 指向。当使用 new 操作符调用绑定函数时,该参数无效。参数:arg1,arg2,…表示当目标函数被调用时,预先添加到绑定函数的参数列表中的参数。

递归
在程序中,递归就是函数自己直接或者间接的调用自己。

作用域

作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。简单来说,作用域的值就是作用范围,也就是说一个变量或函数在什么地方可以使用,在什么地方不能使用。

块级作用域
在 JavaScript 中是没有块级作用域的。

函数作用域
JavaScript 的函数作用域是指在函数内声明的所有变量在函数体内始终是可见的,不涉及赋值。

全局作用域
全局作用域也就是说什么地方都能够访问到。比如我们不用 var 关键字,直接声明变量的话,那这个变量就是全局变量,它的作用域就是全局作用域。使用 window 全局对象来声明,全局对象的属性也是全局变量。另外在所有的函数外部用 var 声明的变量也是全局变量,这是因为内层作用域可以访问外层作用域。
注:

  • 内层作用域可以访问外层作用域,反之不行。
  • 整个代码结构中只有函数可以限定作用域。
  • 如果当前作用规则中有名字了,就不考虑外面的同名变量。
  • 作用域规则首先使用提升规则分析。

变量名提升
JavaScript 是解释型的语言,但是它并不是真的在运行的时候完完全全的逐句的往下解析执行。
JavaScript 引擎在对 JavaScript 代码进行解释执行之前,会对 JavaScript 代码进行预解析,在预解析阶段,会将以关键字 var 和 function 开头的语句块提前进行处理。当变量和函数的声明处在作用域比较靠后的位置的时候,变量和函数的声明会被提升到作用域的开头。

闭包

闭包是指函数可以使用函数之外定义的变量。

简单的闭包
在 JavaScript 中,使用全局变量是一个简单的闭包实例。

var num = 3;
function foo() {
  console.log(num);
}
foo(); //打印 3

复杂的闭包

function f1() {
  var num1 = 6;
  function f2() {
    var num2 = 7;
  }
  console.log(num1 + num2);
}
f1();

arguments 对象

在函数代码中,使用特殊对象 arguments,无需明确指出参数名,我们就能访问它们。第一个参数是 arguments[0],第二个参数是 arguments[1],以此类推。
还可以用 arguments 对象检测函数的参数个数,引用属性 arguments.length 即可。

Function 对象

用 Function() 对象创建函数的语法如下:

var function_name = new Function(arg1, arg2, ..., argN, function_body)

注:每个参数都必须是字符串,function_body 是函数主体,也就是要执行的代码。

Function 对象的 length 属性
函数属于引用类型,所以它们也有属性和方法。length 属性声明了函数期望的参数个数。
Function 对象的方法
Function() 对象也有与所有对象共享的 valueOf() 方法和 toString() 方法。这两个方法返回的都是函数的源代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值