首页 > 其他分享 >js 函数作用域

js 函数作用域

时间:2024-01-21 20:01:13浏览次数:28  
标签:function 函数 作用域 js foo 声明 表达式

在任意代码片段外部添加包装函数,可以将内部的变量和函数定义“隐 藏”起来,外部作用域无法访问包装函数内部的任何内容。 例如:

var a = 2;
function foo() { // <-- 添加这一行
var a = 3; console.log( a ); // 3
} // <-- 以及这一行 foo(); // <-- 以及这一行
     console.log( a ); // 2

虽然这种技术可以解决一些问题,但是它并不理想,因为会导致一些额外的问题。首先, 必须声明一个具名函数 foo(),意味着 foo 这个名称本身“污染”了所在作用域(在这个 例子中是全局作用域)。其次,必须显式地通过函数名(foo())调用这个函数才能运行其 中的代码。 如果函数不需要函数名(或者至少函数名可以不污染所在作用域),并且能够自动运行, 这将会更加理想。 幸好,JavaScript 提供了能够同时解决这两个问题的方案、

var a = 2;
(function foo(){ // <-- 添加这一行 var a = 3;
console.log( a ); // 3 })(); // <-- 以及这一行 console.log( a ); // 2

接下来我们分别介绍这里发生的事情。 首先,包装函数的声明以 (function... 而不仅是以 function... 开始。尽管看上去这并不 是一个很显眼的细节,但实际上却是非常重要的区别。函数会被当作函数表达式而不是一 个标准的函数声明来处理。 区分函数声明和表达式最简单的方法是看 function 关键字出现在声明中的位 置(不仅仅是一行代码,而是整个声明中的位置)。如果 function 是声明中 的第一个词,那么就是一个函数声明,否则就是一个函数表达式。 函数声明和函数表达式之间最重要的区别是它们的名称标识符将会绑定在何处。 比较一下前面两个代码片段。第一个片段中 foo 被绑定在所在作用域中,可以直接通过 foo() 来调用它。第二个片段中 foo 被绑定在函数表达式自身的函数中而不是所在作用域中。 换句话说,(function foo(){ .. })作为函数表达式意味着foo只能在..所代表的位置中 被访问,外部作用域则不行。foo 变量名被隐藏在自身中意味着不会非必要地污染外部作 用域。

匿名和具名 对于函数表达式你最熟悉的场景可能就是回调参数了,比如:

setTimeout( function() {
         console.log("I waited 1 second!");
}, 1000 );

这叫作匿名函数表达式,因为 function().. 没有名称标识符。函数表达式可以是匿名的, 而函数声明则不可以省略函数名——在 JavaScript 的语法中这是非法的。 匿名函数表达式书写起来简单快捷,很多库和工具也倾向鼓励使用这种风格的代码。

标签:function,函数,作用域,js,foo,声明,表达式
From: https://blog.51cto.com/u_16273048/9355711

相关文章

  • js 规避冲突
    隐藏”作用域中的变量和函数所带来的另一个好处,是可以避免同名标识符之间的冲突,两个标识符可能具有相同的名字但用途却不一样,无意间可能造成命名冲突。冲突会导致变量的值被意外覆盖。例如:functionfoo(){functionbar(a){i=3;//修改for循环所属作用域中的i......
  • js 函数作用域和块作用域
    但是,究竟是什么生成了一个新的气泡?只有函数会生成新的气泡吗?JavaScript中的其他结构能生成作用域气泡吗?函数中的作用域对于前面提出的问题,最常见的答案是JavaScript具有基于函数的作用域,意味着每声明一个函数都会为其自身创建一个气泡,而其他结构都不会创建作用域气泡。但......
  • 无涯教程-Node.js - 扩展程序
    Node.js以单线程模式运行,但是它使用事件驱动来处理并发,它还有助于创建子进程,以在基于多核CPU的系统上利用并行处理。子进程始终具有三个流child.stdin,child.stdout和child.stderr,它们可以与父级的stdio流共享处理。Node提供了child_process模块,该模块具有以下三种创建......
  • 无涯教程-Node.js - Request Object函数
    req对象代表HTTP请求,并具有请求查询字符串,参数,正文,HTTP标头等的属性。RequestObject属性以下是与请求对象关联的一些属性的列表。Sr.No.Properties&描述1req.app此属性保存对使用中间件的快速应用程序实例的引用。2req.baseUrl的安装路由器实例的URL路径。......
  • 详解ffmpeg avcodec_encode_video2 函数报错
    详解ffmpegavcodec_encode_video2函数报错在使用FFmpeg进行视频编码时,开发者经常会使用avcodec_encode_video2函数来进行编码操作。然而,有时候会遇到该函数报错的情况,本文将详细解析这个问题及其可能的解决方法。问题描述当调用avcodec_encode_video2函数时,可能会出现以下错误信......
  • 无涯教程-Node.js - Response Object函数
    res对象表示Express应用程序在收到HTTP请求时发送的HTTP响应。响应对象属性以下是与响应对象关联的一些属性的列表。Sr.No.Properties&描述1res.app此属性保存对使用中间件的快速应用程序的引用。2res.headers已发送布尔值属性,指示应用程序是否为响应发送了H......
  • Github图床搭建,结合Picgo与jsdelivr的免费cdn加速,以及部分问题解决方案
    留份文档,便于后续查询===================用到的地址:Github:GitHubPicgo:PicGoisHere|PicGojsdelivr加速地址:https://cdn.jsdelivr.net/gh/Github用户名/仓库名@master===================1.创建一个GitHub仓库:进入你的GitHub首页,在右上角你会找到一个➕,在下拉菜单中......
  • STL—函数对象
    函数对象概念1、重载函数调用操作符的类,其对象常称为函数对象2、函数对象使用重载的()时,行为类似函数调用,也叫仿函数本质函数对象(仿函数)是一个类,不是一个函数函数对象的使用特点:1、函数对象在使用时,可以像普通函数那样调用,也可以有参数,可以有返回值2、函数对象超出普通函数的概念,函......
  • 无涯教程-Node.js - RESTFul API
    REST是基于Web标准的体系结构,并使用HTTP协议,它围绕资源展开,其中每个组件都是资源,并且使用HTTP标准方法通过公共接口访问资源。REST由RoyFielding于2000年首次提出。HTTP方法在基于REST的体系结构中,通常使用以下四种HTTP方法。GET     -用于提供对资源的只读访问......
  • 前端js方法的书写顺序,比如有内部方法,外部方法,用户触发的动作方法,监听事件方法,等等,
    在前端JS开发中,通常的方法书写顺序如下:变量声明和初始化内部方法定义外部方法定义初始化函数事件监听方法定义用户触发的动作方法定义这个顺序的主要目的是提高代码的可读性和可维护性。按照这个顺序,可以使代码更加清晰、易于理解和修改。变量声明和初始化应该在前面,因为......