错误
原因:在函数外部无法读取函数内的局部变量
function f1(){
var num=1;
}
alert(num);
一个函数就可以理解为一个闭包
function f1() {
alert(1);
}
闭包的用途,可以读取函数内部的变量,让这些变量的值始终保持在内存中
function fn1(){
let a = 1
代码中的内部函数(fn2)就是闭包 可以把闭包简单理解成"定义在一个函数内部的函数" 是将函数内部和函数外部连接起来的一座桥梁 闭包就是能够读取其他函数内部变量的函数通过这种方式 就可以得到fn1的局部变量a的值
function fn2(){
document.write(a);
}
return fn2;
}
console.log( fn1() )
fn1()()
/* function fn(){}
console.log(fn);
变量提升 当你下面使用var的时候会出现变量提升的情况
var a => a = undefined (已经声明了
但是没有赋值,给了一个初始值叫做undefined )
console.log(a);
var a = '123';
var a = 123;
var a = 456;
console.log(a);
let 不存在变量提升,不能在还没有初始化的时候 使用变量,否则就给报错 下面的代码就不会被执行
console.log(a)
let a = '123'
console.log(123);
let不能够重复定义
let a = 123;
let a = 456;
console.log(a);
函数是js里面的一等公民 声明了function会提升函数到最前面 页面一加载的时候会先找有没有 var 和 function 如果发现有var 就会把变量预定义为undefined 如果发现有function 就会把function这个方法放在最前面
function fn(){
console.log(111);
}
a = undefined
fn();
var a = '123'
function fn(){
console.log(111);
}
定义个变量 在定义一个函数 变量是一个字符串 在函数里面打印出来
a是一个全局的变量
变量提升阶段
function fn(){
console.log(a);
}
a = undefined
代码执行阶段 打印undefined a被赋值成 123 最后打印123
fn();
var a = '123'
function fn(){
console.log(a);
}
console.log(a);
作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期
变量的作用域有两种 全局作用域 局部作用域
a是全局变量具有全局作用域
let a = 123;
function fn1(){
和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到
b是局部变量 具有局部作用域
let b = '222'
console.log(c);
console.log(a);
}
fn1()
console.log(b);
最外层函数和在最外层函数外面定义的变量拥有全局作用域
所有未定义直接赋值的变量自动声明为拥有全局作用域
c='ccc'
function fn2(){
fn1();
console.log(c);
console.log(b);
console.log(a);
console.log(window.top);
}
fn2()
所有window对象的属性拥有全局作用域 window对象的内置属性都拥有全局作用域,例如window.name、window.location、window.top等等
console.log(name);
window里面的地址对象
console.log(window.location);
window.top 也是window的一个属性
console.log(window.top);
可以通过代码访问的属性和一系列仅供JavaScript引擎访问的内部属性该内部属性包含了函数被创建的作用域中对象的集合,这个集合被称为函数的作用域链
-
全局作用域
let a = '你好'
function fff(){
a = '摩西摩西'
function fn() {
局部作用域
a = 'hello';
document.write(a);
}
fn();
}
fff();
作用域链 首先会在当前的作用域内去变量对应的值 如果找不到,会向上一层一层的去寻找
let str = 'abc';
第一种方法
let s = ''
for(var i=str.length-1;i>=0;i--){
s+=str[i]
}
console.log(s);
第二种方式
reverse把数组的顺序倒过来
console.log( str.split('').reverse().join('') )
第三种方式
let arr = [];
for(var i in str){
arr.unshift(str[i])
}
console.log( arr.join('') );