JS&ES6&DOM&BOM

javaScript-04

2020-10-14  本文已影响0人  Grandperhaps

作用域

JS没有块级作用域

if(true){
  int num = 123;
  system.out.print(num);  // 123
}
system.out.print(num);    // 报错

以上java代码会报错,是因为代码中 { } 即一块作用域,其中声明的变量 num,在 “{ }” 之外不能使用;

而与之类似的JavaScript代码,则不会报错:
Js中没有块级作用域(在ES6之前)

  if(true){
    var num = 123;
    console.log(123); //123
  }
  console.log(123);   //123

全局变量

局部变量

全局变量和局部变量的区别

作用域链

作用域链:采取就近原则的方式来查找变量最终的值。

var a = 1;
function fn1() {
    var a = 2;
    var b = '22';
    fn2();
    function fn2() {
        var a = 3;
        fn3();
        function fn3() {
            var a = 4;
            console.log(a); //a的值 ?
            console.log(b); //b的值 ?
        }
    }
}
fn1();
图片2.png

预解析

JavaScript 代码是由浏览器中的 JavaScript 解析器来执行的。JavaScript 解析器在运行 JavaScript 代码的时候分为两步:预解析和代码执行。

变量预解析

预解析也叫做变量、函数提升。
变量提升(变量预解析): 变量的声明会被提升到当前作用域的最上面,变量的赋值不会提升。

console.log(num);  // 结果是多少?
var num = 10;      // ?

结果:undefined
注意:**变量提升只提升声明,不提升赋值**
函数预解析

函数提升: 函数的声明会被提升到当前作用域的最上面,但是不会调用函数。

fn();
var  fn = function() {
    console.log('想不到吧');
}
结果:报错提示 ”fn is not a function"

解释:该段代码执行之前,会做变量声明提升,
fn在提升之后的值是undefined;而fn调用是在fn被赋值为函数体之前,
此时fn的值是undefined,所以无法正确调用
上一篇 下一篇

猜你喜欢

热点阅读