笔记九、JavaScript 函数作用域与this

一、函数参数

(一)形式参数与实际参数

function getSum(a, b) {
    return a + b;
}
getSum(10, 20); // 30

在函数定义语句中,定义在参数列表中的 a 和 b 是 getSum 函数的形式参数;调用时传入的则是实际参数,如  10 和 20 就是实际参数。

(二)参数规则

  1. JavaScript 函数对参数的值不会进行任何的检查,不会关注有多少个参数被传递,也不关注传递的参数的数据类型。
  2. 在JavaScript中,函数参数的默认值是 undefined。

(三)arguments对象

函数的实际参数会被保存在一个类似数组的 arguments 对象中。在函数内,我们可以通过像数组元素的访问方式来找出传入的参数:arguments[i],对于参数的数量,我们可以通过arguments.length 来获取。

二、函数作用域

(一)全局作用域

       一个函数是可以访问定义在其范围内的任何变量和函数;定义在全局域中的函数可以访问所有定义在全局域(全局作用域)中的变量。

一般来说以下几种情形拥有全局作用域:

  • 最外层函数或者是在最外层函数外面定义的变量拥有全局作用域;
  • 所有未通过var关键字定义而直接赋值的变量将自动被声明为全局变量;
  • 所有window对象的属性拥有全局作用域。 

注意:作用域是分层的,内层作用域可以访问外层作用域的变量,而外层作用域则无法直接访问内层作用域中的变量

(二)局部作用域

       函数内定义的变量是不能在函数之外的任何地方访问的,因为这些变量仅仅在该函数的域的内部有效。

(三)作用域链

       外层是无法直接访问函数内定义的局部变量的,可以在函数内部再定义一个函数

三、闭包

通过闭包,可以一个内层函数中访问其外层函数的作用域,闭包是由函数以及声明该函数的词法环境组合而成的,且该环境包含了这个闭包创建时作用域内的任何局部变量。

(一)闭包使用场景

常见的两个场景如下:

(1) 读取函数内部的变量;

(2) 让局部变量的值始终保持在内存中。

​​​​​​注意:闭包只会保存被子作用域引用的变量,对于未被使用到的变量仍会被回收

四、this关键字

JavaScript 中的原始对象,一般是以字典(键值对)的结构来保存的,每一个属性名都对应一个属性表述对象

var obj = { foo: 5}   // obj保存的是一个地址,通过地址来获取对象,返回foo属性,一般属性的值是保存在该属性表述对象的 value 属性中的。

(一)函数

var obj = { foo: function () {} };  //  先将函数单独保存在内存中,然后将函数的地址值赋值给 foo 属性的 value 属性。

(二)环境变量

使用 this:专门用于函数体内部,用来指代函数当前的运行环境的

           var f = function () {
                      console.log(this.x); 
// 输出当前运行环境中的x
           };

总结:谁调用的函数,函数内部的 this 就指向谁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值