作用域 {#作用域}
执行上下文
console.log(a); // undefined
var a = 100;
fn('zhangsan') // 'zhangsan' 20
function fn(name) {
age = 20;
console.log(name, age);
var age;
}
- 范围:一段<script>或者一个函数
- 全局:变量定义、函数声明
- 函数:变量定义、函数声明、this、arguments
- 注意⚠️“函数声明”和“函数表达式”的区别
fn()
function fn() {
//声明
}
fn1()
var fn1 = function () {
//表示
}
var a = 100; //类似于这个
//全局声明
console.log(a);
var a = 100;
fn('zhangsan')
function fn(name) {
console.log(this);
age = 20;
console.log(name,age);
var age;
bar(100);
function bar(num) {
console.log(num);
}
}
作用域
//无块级作用域
if(true){
var name = 'zhangsan';
}
console.log(name);
//函数和全局作用域
var a = 100;
function fn() {
var a = 200;
console.log('fn',a);
}
console.log('global',a);
fn();
如何理解作用域
var x=10;
function foo() {
alert(x);
}
function bar() {
var x=20;
foo();
}
bar();
变量作用域
静态作用域
var x=10;
function foo() {
alert(x);
}
function bar() {
var x=20;
foo();
}
bar();
动态作用域
JS变量作用域
- JS使用静态作用域
- JS没有块级作用域(全局作用域、函数作用域)(ES5)
- ES5中使用词法环境管理静态作用域
var x = 10;
function foo() {
var z = 30;
function bar(q) {
return x + y + q;
}
return bar;
}
var bar = foo(20);
bar(40);
作用域链
var a = 100;
function fn() {
var b = 200;
//作用域没有定义变量,即“自由变量”
console.log(a);
console.log(b);
}
fn();
var a = 100;
function F1() {
var b = 200;
function F2() {
var c = 300;
console.log(a);//a是自由变量。形成一个链式结构,向父级去查找
console.log(b);//b是自由变量
console.log(c);//
}
}
对变量提升的理解
创建10个<a>
标签 点击的时候弹出来对应的序号
//这是一个错误的写法!!!
var i,a;
for (var i = 0; i < 10; i++) {
a = document.createElement('a');
a.innerHTML = i + '<br>';
a.addEventListener('click',function (e) {
e.preventDefault();
alert(i)
})
document.body.appendChild(a);
}
//输出为如下: <a>"9"<br></a>
//这是一个正确写法!!!
var i;
for (i = 0; i < 10; i++) {
(function(i){
var a = document.createElement('a');
a.innerHTML = i + '<br>';
a.addEventListener('click',function (e) {
e.preventDefault();
alert(i);
})
document.body.appendChild(a);
})(i)
}