首先我们要了解什么是作用域?
作用域值得是我们有权访问的变量集合。
-1.JavaScript 函数作用域
- JavaScript中有两种作用域类型:
- 局部作用域
- 全局作用域
所谓函数作用于就是:
每个
函数创建一个新的作用域
;
作用域决定了这些变量的可访问性
;
函数内部定义的变量在函数外部是不可访问的。
-1.1局部JavaScript 变量
在JavaScript 函数中声明的变量,会成为函数的
局部变量
局部变量的作用域是局部的
:只能在函数内部访问它们。
例如: 例子中 a 只能在函数内部被访问,函数外部无法访问变量 a
submit();
function submit() {
let a = 11;
console.log(a);
}
console.log(a);
//测试为报错。因为在函数外面的console.log中变量 a 未定义。
//但是执行了submit()函数以后控制台输出11.
由于只能在函数内部识别局部变量,因此能够在
不同函数中使用同变量名。
在函数开始时会创建局部变量,在函数完成时会删除他们。
-1.2全局JavaScript变量
函数之外声明的变量,会成为全局变量
全局变量的作用域是全局的:网页所有的脚本和函数都能够访问它
例子:例子中a可以在函数内外进行访问,在定义其它的函数也可以访问a。
submit();
let a = 11;
function submit() {
console.log(a);
}
console.log(a); //输出11 执行submit()函数是再次输出11。
-2.JavaScript变量
在JavaScript 中,对象和函数也是变量
作用域决定了从代码不同部分对变量、对象和函数的可访问性。
-2.1自动全局
如果为
尚未声明的变量赋值,此变量会自定成为全局变量
例如:执行结果为 tom tom 。
myname();
function myname() {
name = "tom";
console.log(name);
}
console.log(name);
-2.2严格模式 "use strict"
它不算是一条语句,而是一段文字表达,
作用是指示JavaScript代码应该以“严格模式”执行,在严格模式中,无法使用未声明的变量
“use strict”指令只能在脚本或函数的开头被识别。
如何声明严格模式?
- 通过在脚本或者函数的开头添加
“use strict”;
来声明严格模式 - 在脚本开头进行声明,拥有全局作用域,也就是说脚本中所有代码均以严格模式来执行。
例如:
"use strict";
myFunction();
function myFunction() {
y = 3.14; // 这会引发错误,因为 y 尚未声明
}
- 在函数中声明严格模式,则只有函数中的代码以严格模式执行
-2.2.1 为什么要使用严格模式
- 严格模式使得我们更容易编写安全的JavaScript代码
- 严格模式把之前可接受但是不好的语法转为真正的错误
例如:在普通的JavaScript 中,打错了变量名会创建新的全局变量,但是使用严格模式以后,打错变量名就会抛出错误
-2.2.2严格模式中不允许的事项
- 在不声明变量的情况下使用变量是不允许的:
- 在不声明对象的情况下使用对象是不允许的
- 删除变量或对象
- 删除函数
- 重复参数名
- 八进制数值文本
- 转义字符
- 写入只读属性
- 写入只能获取的属性
- 删除不可删除的属性
- 字符串
“eval”,“arguments”
不可用作变量 with
语句- 不允许
eval()
在其被调用的作用域中创建变量
严格模式中不允许使用为未来预留的关键词。它们是:
- implements
- interface
- let
- package
- private
- protected
- public
- static
- yield
-3HTML中的全局变量
在HTML中,全局作用域是window。所有全局变量均属于window对象。
实例:在 HTML 中,通过var 定义的全局变量,会成为 window 变量。
var myname = "tom";
// 此处的代码能够使用window.myname
document.getElementById("demo").innerHTML = window.myname
-4JavaScript变量的有限期
JavaScript 变量的有效期
始于其被创建时。
局部
变量会在函数完成时
被删除。
全局
变量会在您关闭页面时
被删除。
-5函数参数
函数参数也是函数内的
局部变量