JS函数、预编译以及作用域

javascript函数

  • 申明式函数
function fn(){}
  • 赋值式函数
const fn=function(){}

当申明了形参但是调用时没有传参时,自动赋值undefined

  • 终止函数执行:return;
  • 当函数没有返回值时,默认返回undefined
  • 每个函数只能有一个返回值,允许是任意数据类型
  • 每个函数对象都有一个length属性,表示需要传入的实参的个数;而arguments.length表示的是实际传入的实参的个数
    var a = function(d,b,c){}
    console.log(a.length) //3
    

arguments

  • JS中的函数可以不申明形参,直接传实参,通过arguments获得实参

  • 注意点

    1. 每个函数都拥有一个arguments对象
    2. arguments只能在函数内使用
    3. arguments是一个类数组对象,通过索引index访问
  • arguments对象中的两个属性

    1. length属性
    2. callee属性
      • arguments.callee指向当前函数,返回函数原型,可以通过arguments.callee()调用

JS预编译

  • JS引擎在执行代码之前,会优先进行预编译操作
  • 创建AO/GO对象
    1. 找到所有在全局环境下function关键字和var关键字的声明
    2. 将var/function等声明的变量进行创建,并赋值为undefined
    3. 将function声明的函数优先执行(即预编译时将函数赋值给变量)(这里指声明式函数)
    function fn(a) {
      console.log(a);// AO对象的值为      function a(){} 
      var a = 123;// 变量声明已经在预编译的时候执行的了 在执行时不会执行变量声明 改变Ao对象中属性a值为123
        console.log(a); // 123
        function a(){}// 这也不执行
          console.log(a);  // 123
          var b = function(){} // vaar b不执行 改变AO对象中的属性b为function(){}
          console.log(b);// function() {}
        function d(){}// 不执行
    }
    fn(1);
    
  • 举例
a(); //输出函数a的原型 
var a = 10;
function a() {
    console.log(a);
}
a(); //报错

作用域

  • JS(ES5)中只有两种作用域
    • 全局作用域
    • 函数作用域
function fn(){
    var a=b=3
    // 给没有声明过的变量赋值,这个变量是全局变量
    // 这里a是局部变量,b是全局变量
}
  • 举例 (预编译+作用域)
var a=1;
function fn(){
        console.log(a); //undefined
        var a=2;
        console.log(a); //2
}
console.log(a); //1
fn(a);
console.log(a) //1

作用域链

  • 函数创建时会创建 活动对象(AO)和全局(GO 代码中的所有全局变量)对象,活动对象在函数调用结束后销毁
  • 一般情况下,变量取值到 创建 这个变量 的函数的作用域中取值。
  • 但是如果在当前作用域中没有查到值,就会向上级作用域去查,直到查到全局作用域,这么一个查找过程形成的链条就叫做作用域链。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值