JS预解析+作用域+this指向

本文详细探讨了JavaScript中的预解析机制,包括变量提升和函数声明的提升。接着讲解了词法作用域的规则,通过示例解释了函数在声明时就决定其作用域。接着讨论了作用域链的概念,以及`this`的关键字在不同场景下的指向。最后,文章还涉及到了`new`关键字在构造函数中的工作原理以及静态成员和实例成员的区别。
摘要由CSDN通过智能技术生成

预解析一

var name = 'World!';

(function() {

    if (typeof name === 'undefined') {
      var name = 'Jack';
      console.log('Goodbye ' + name);
    } else {
      console.log('Hello ' + name);
    }
})();

答案:Goodbye Jack

注释

1.代码执行前,先预解析。

2.var变量提升,提升到当前作用域最前面。

3.首先给全局的变量name赋值为’World!’,然后匿名函数自调用。

4.把匿名函数里的变量name提升到当前作用域最前面。

5.匿名函数里的name声明但未赋值,所以name为undefined。typeof name === undefined为true。

6.所以执行结果为Goodbye Jack。

下面是预解析代码过程

var name;

(function() {
    
    var name;   变量声明未赋值==>undefined
    if (typeof name === 'undefined') {
      name = 'Jack';
      console.log('Goodbye ' + name);
    } else {
      console.log('Hello ' + name);
    }
})();

name = 'World!';

词法作用域

词法作用域规则:函数的作用域在声明的时候就已经决定了,与调用位置无关。

var a = 10;
  
function aaa() {

    alert(a);
}
  
function bbb() {

    var a = 20;
    aaa();
}
  
bbb();

答案:10。

分析:

1.预解析,把a的声明和函数aaa() 和函数bbb() 声明提升到当前作用域最前面。

2.给全局的a赋值为10,然后调用bbb()。

3.函数执行前要预解析,将函数bbb里的变量a提升到当前作用域,然后执行函数bbb。并给a赋值为20.再调用函数aaa()。

4.因为函数aaa的作用域在声明的时候就已经在全局了,所以aaa内部访问变量a的时候,按照作用域链的查找规则,找到全局的a。并alert(a)为10。

下面是预解析代码过程

var a;

function aaa(){

    alert(a);
}

function bbb(){
    
    var a;
    a = 20;
    aaa();
}

a = 10;

bbb();

作用域

题目一:

var scope = 'global scope';
      
function checkScope() {
        
    var scope = 'local scope';
    
    function f() {

        return scope;
  
    }

    return f;
}

var fn = checkScope(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值