问题记录(待合并)
2022年10月14日大约 5 分钟
小知识点
引用独立的 JavaScript 文件时,
<script>
元素不能包含任何JavaScript代码。alert()
:仅当你要停止一切并提醒用户时,才应使用它在任何情况下,
</script>
结束标签都是必不可少的浏览器分 两遍 读取网页:第一遍读取所有的函数定义,第二遍开始执行代码。这让你可以将函数放在文件的任何地方。
没有使用
var
声明的变量是全局变量
特殊类型
null
:在应该提供一个对象,但无法创建或找到时,将提供 null(null 用于表示不存在的对象 typeof null 结果为 object)
undefined
:在变量未初始化、对象没有指定属性或数组没有指定元素时,将返回 undefined
NaN
:无法表示的数字(typeof NaN 结果为 number),并且 NaN 不等于 NaN,使用函数isNaN()
检测
相等性判断
类型相同,直接判断
类型不同,尝试转换为相同类型再进行比较
- 数字和字符串,转换为数字
- 布尔值和其他类型,转换为数字再进行比较
undefined == null
返回true
被视为假值的值:
undefined
、null
、0
、空字符串
、NaN
编码指南
- 在开头声明全局变量
- 将函数定义统一放在文件的开头或结尾
- 在函数开头声明局部变量
函数声明与函数表达式
浏览器执行流程
浏览器会在执行所有 JS 代码之前分析网页,查找其中的函数声明
找到函数声明时
- 创建相应的函数
- 将得到的函数引用赋值给与函数同名的变量
处理所有的函数声明后,浏览器回到代码开头,开始从头到尾顺序执行代码
- 如果遇到函数声明,因为之前已经处理够了,所以直接跳过
// 函数声明
function quack() {
console.log('quack')
}
// 函数表达式
var fly = function () {
console.log('fly')
}
quack()
fly()
区别
- 函数声明是一条语句,可以认为它包含一条隐藏的赋值语句,将函数引用创建并赋值给一个函数同名变量
- 函数表达式不自动将函数引用赋值给任何变量,必须显式的这样做,要么将函数(引用)赋值给一个变量,要么以其他方式使用函数表达式
- 使用函数声明时,函数将在执行代码前创建
- 使用函数表达式时,函数将在运行阶段执行代码时创建
一等值
- 可以将其赋给变量或存储在数组和对象等数据结构中
- 可以将其传递给函数
- 可以从函数中返回它们
闭包
名词,指的是函数和引用环境
- 局部变量:在函数体内部定义的变量,包括所有的形参
- 自由变量:不在本地定义的变量(不是在本地声明的,没有绑定到任何值)
- 对于函数体内的变量,如果它既不是在本地定义的,又不是全局变量, 便可肯定它来自包含当前函数的其他 函数,可从环境中获取其值
- 包含自由变量的函数与为所有这些自由变量提供了变量绑定的环境一起,被称为闭包
- 并非只能通过从
函数返回函数来创建闭包
,如果函数使用了自由变量,则每当你在创建该函数的上下文外面执行它时,都将创建一个闭包
- 将
函数传递给函数时,也将创建闭包
。在这种情况下,传递的函数将在完全不同于定义它的上下文中执行
var justAVar = "Oh, don't you worry about it, I'm GLOBAL"
function whereAreYou() {
var justAVar = 'Just an every day LOCAL'
function inner() {
return justAVar
}
return inner()
}
var innerFunction = whereAreYou()
var result = innerFunction()
console.log(result)
// A:Oh, don't you worry about it, I'm GLOBAL
// B:Just an every day LOCAL
var justAVar = "Oh, don't you worry about it, I'm GLOBAL"
function whereAreYou() {
var justAVar = 'Just an every day LOCAL'
function inner() {
return justAVar
}
return inner
}
var innerFunction = whereAreYou()
var result = innerFunction()
console.log(result)
// A:Oh, don't you worry about it, I'm GLOBAL
// B:Just an every day LOCAL
构造函数工作原理
new
首先创建一个空对象- 接下来,
new
设置this
,使其指向这个对象 - 设置
this
后,调用函数构造函数Person
并将实参进行传递 - 执行构造函数
Person
代码,给新创建的this
对象的属性赋值 Person
函数执行完毕后,运算符new
返回this
(自动返回,武学在代码中显式返回),指向新创建的对象的引用 (构造函数返回值,除非返回的是this
)
构造函数名采用驼峰命名法,并且首字母要大写(约定俗成)
使用构造函数创建的对象时,
this
被设置为一个引用,指向正在创建的新对象,因此构造函数的所有代码针对的都是这个新对象对象创建后,当对其调用方法时,
this
被设置为方法被调用的对象,因此,在方法中,this
总是表示方法被调用的对象
在任何情况下,this 都指向原始对象即方法被调 用的对象,即便该方法位于原型中也是如此