JS函数本身的作用域实例分析

JS函数本身的作用域实例分析

在JS中,函数拥有自身的作用域,也可以使用父级作用域中的变量。函数本身的作用域指的是在其内部可以访问的变量和函数。本文将详细讲解JS函数本身的作用域,以及两个具体的实例分析。

1. 函数内部作用域

函数内部可以访问的变量有两种,分别是自有变量和父级变量。

1.1 自有变量

自有变量指的是函数内部定义的变量,只能在函数内部访问。例如下面的代码片段:

function demo() {
  var name = '张三';
  console.log(name);
}

demo(); // 输出 '张三'
console.log(name); // 抛出错误,name未定义

在函数内部定义了名为 name 的变量,这个变量只能在函数内部使用,无法在外部访问到。

1.2 父级变量

在函数内部还可以访问到父级作用域内的变量,这种作用域链的是因为JS采用了词法作用域。例如下面的示例:

var age = 18;

function demo() {
  console.log(age);
}

demo(); // 输出 18

函数内部并没有定义变量 age,但是由于函数的父级作用域是全局作用域,所以可以在函数内部访问到全局变量 age 的值。

2. 函数自身作用域

函数本身的作用域是在函数定义时确定的。可以在在函数内部使用自有变量和访问父级变量,但是无法在函数外部访问这些变量。下面是一个示例:

function demo() {
  var name = '张三';

  function inner() {
    console.log(name);
  }

  inner(); // 输出 '张三'
}

demo();
console.log(name); // 抛出错误,name未定义

在函数内部定义了一个名为 inner 的函数,这个函数可以访问到外层 demo 函数内部定义的变量 name,输出了变量的值。而在函数外部访问变量 name 会抛出错误。

3. 示例分析

3.1 示例一:使用闭包实现计数器功能

闭包可以访问到创建它的函数的内部变量,在这个例子中,利用函数本身的作用域和闭包的特性,实现了一个计数器:

function counter() {
  var num = 0;

  return function() {
    num ++;
    console.log(num);
  }
}

var c1 = counter();
c1(); // 输出 1
c1(); // 输出 2
c1(); // 输出 3

var c2 = counter();
c2(); // 输出 1
c2(); // 输出 2

counter 函数内部定义了一个变量 num,并且返回了一个闭包,这个闭包可以访问到 num 变量。在外部多次调用闭包,每次都能够更新 num 的值并输出。

3.2 示例二:使用匿名函数实现模块化

利用函数本身的作用域可以实现模块化开发,通过匿名函数的方式可以模拟出模块的功能:

var module = (function() {
  var name = 'module';

  function getName() {
    return name;
  }

  return {
    getName: getName
  }
})();

console.log(module.getName()); // 输出 'module'

在示例中,利用匿名函数自身作用域的特性,定义了一个名为 module 的变量,并且返回了一个对象,这个对象包含了用于外部调用的函数 getName。在外部调用 module.getName() 可以输出 'module'。这种方式可以模拟出一个独立的模块,避免了全局变量的污染。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS函数本身的作用域实例分析 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • 分享11个常用JavaScript小技巧

    分享11个常用JavaScript小技巧 在这篇文章中,我们将分享11个常用的JavaScript小技巧,这些技巧能够帮助你更好的理解JavaScript的各种特性和功能。下面是这11个小技巧的详细说明: 技巧1: 使用let和const关键字 使用let和const关键字可以声明变量和常量,相比使用var声明的变量,let和const关键字具备了更好的作用…

    JavaScript 2023年5月18日
    00
  • jquery 表单验证之通过 class验证表单不为空

    下面就为您详细讲解jquery表单验证之通过class验证表单不为空的完整攻略。 1. 确定需要验证的表单 首先,我们需要确定需要进行验证的表单。在HTML中,我们可以为需要验证的表单元素添加class属性来标识。例如: <form action="" method="post"> <div> …

    JavaScript 2023年6月10日
    00
  • Vue中$router与 $route的区别详解

    Vue中$router与$route的区别详解 在Vue中,$router和$route两个属性经常被用到,但是它们又有什么区别呢? $route $route是Vue-Router中的一个对象,它包含了当前路由的信息,例如当前的路径、参数、query参数等。在组件中可以通过this.$route来访问。 下面通过一个示例来说明: <template&…

    JavaScript 2023年6月11日
    00
  • Javascript 类型转换、封闭函数及常见内置对象操作示例

    针对“Javascript 类型转换、封闭函数及常见内置对象操作示例”的完整攻略,以下是详细的讲解: 一、Javascript类型转换 Javascript是一门动态类型语言,其变量类型的值可以根据上下文自动判断,可以进行隐式转换,也可以手动进行显式转换。 1. 隐式转换 在Javascript中,隐式类型转换是将一种类型的数据转换为另一种类型的数据,且数据…

    JavaScript 2023年5月27日
    00
  • 浅谈下拉菜单中的Option对象

    下拉菜单是Web界面设计中常用的界面元素之一,Option对象是下拉菜单中的选项对象。要想了解Option对象,需要从以下几个方面来讲解: 1. Option对象的定义 Option对象是HTML下拉列表(select)元素中的一个选项对象,每个选项对象都有以下属性和方法: <option value="option_value" …

    JavaScript 2023年6月10日
    00
  • Z-Blog中用到的js代码

    当我们使用Z-Blog来构建网站时,会用到一些js代码。这些js代码可以增强网站的用户体验和交互效果。以下是对Z-Blog中用到的js代码的详细讲解: 一、加载js代码的方法 在Z-Blog中,我们可以使用以下两种方法来加载js代码: 在\zb_users\theme\主题名\template\header.php中使用如下代码引入js文件: <scr…

    JavaScript 2023年6月11日
    00
  • javaScript封装的各种写法

    JavaScript中的封装是面向对象编程中的重要概念之一,主要目的是为了保护数据和方法,防止被其他代码随意篡改。下面我会详细讲解JavaScript封装的各种写法。 JavaScript封装的各种写法 1. 构造函数 构造函数是创建对象的基础,可以使用函数封装对象的属性和方法,我们可以用this关键字指向当前对象,来实现对属性和方法的操作。下面是一个示例:…

    JavaScript 2023年6月10日
    00
  • 怎么清空javascript数组

    当我们需要清空一个 JavaScript 数组时,有以下几种方法可以实现。 方法一:重新赋值 可以通过重新将一个空数组赋值给目标数组来清空该数组。代码如下: let arr = [1,2,3,4]; arr = []; console.log(arr); // 输出 [] 在上面的代码中,我们将一个包含 1 到 4 的数组赋给变量 arr,然后使用空数组重新…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部