函数的作用域以及预编译

一、函数的作用域

  • 函数作用域有点像单面镜(外面看不到里面,里面可以看到外面)
  • JS的特点:单线程、是 解释性语言 (翻译一行,执行一行)

二、预解析

JS预解析三部曲:语法解析 ⇒ 预编译 ⇒ 解释执行

JS 在执行之前会通篇扫描代码,看有没有语法语义错误(语法解析),如果没有,然后开始执行代码(预编译)

  • 通篇扫描 --> 语法分析
  • 通篇扫描之后开始执行 --> 预解析
test(); // 这种情况仍然会执行,就是预编译的作用function test() {console.log('a');
}// 在没有定义之前就使用结果为 undefined
console.log(a); // 能输出,是 undefined,还是因为预解析
var a = 10;// 但是这种就不行,因为变量没有定义就执行 b is not defined
console.log(b);

三、变量和函数的提升

  1. 函数声明整体提升:不管你在哪调用函数,因为预解析会把函数提到逻辑的最前面,所以都是在函数的下面调用这个函数
  2. 变量声明提升
  3. imply global 暗示全局变量:即任何变量,如果变量未经声明就赋值,此变量就为全局对象所有
a = 123;
console.log(a); // 123
console.log(window.a); // 123
  1. 一切声明的全局变量,都是 window 属性
var b = 234;
console.log(b); --> console.log(window.b); // 234
  1. 如果在全局作用域下访问变量,就相当于访问 window.变量名
var a = b = 123; // 顺序:先把 123 赋值给 b;再 let a 声明变量;最后把 b 赋值给 a。
// 但是这就导致了,b 归全局作用域所有
console.log(window.a, window.b); // undefiend 123var c = d = 234;
console.log(window.c, window.d); // 234 234

预编译四部曲

  1. 创建AO对象
  2. 找形参和变量声明,将变量和形参名作为AO属性名,值为 undefined
  3. 将实参值和形参统一
  4. 在函数体里面找函数声明,值赋予函数体

预编译练习提升的意思就是被优先执行了

function fn(a) {console.log(a); // function a() {}var a = 123;console.log(a); // 123function a() {}console.log(a); // 123var b = function () {}console.log(b); // function() {}function d() {}
}// 预编译发生在函数执行的前一刻
fn(1);/*1. 创建AO对象 (Activation Object) 2. 用形参和变量声明的名,作为AO对象的属性名,值统一为 undfiendAO {a : undefined,b : undefined}3. 把形参和实参的值统一AO {a : 1,b : undefined}4. 在函数体里面找函数声明,赋予函数体AO {a : function a() {}, // 只有函数声明会提升,函数表达式不会提升b : undefined,d : function d() {}}5. 函数执行AO {a : 123,b : function() {},d : function d() {}}
*/

在全局下会生成一个GO对象(Global Object)

function test() {var a = b = 123;console.log(a);console.log(window.b); // 123console.log(window.a); // undefined
}
test();/*GO: {b: 123;}AO: {a: undefined}
*/

函数声明整体提升 变量声明提升

a = 100;
function demo(e) {function e() {}arguments[0] = 2;console.log(e); // 2if (a) { // a 是 undefined 所以这里 if 不会执行var b = 123;function c() {// 猪都能做出来}}var c;a = 10;var a;console.log(b); // undefinedf = 123;console.log(c); // undefinedconsole.log(a); // 10
}
var a;
demo(1);
console.log(a); // 100
console.log(f); // 123/*GO {a: 100f: 123function demo() {}}AO {c: undefineda: 10e: 2}
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/556171.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

完整版PayPal支付(java后端教程)

首先引入 PayPal的sdk 这里我引入的是1.0.4版本的 <!-- 贝宝支付 SDK --><dependency><groupId>com.paypal.sdk</groupId><artifactId>checkout-sdk</artifactId><paypal-sdk.version>1.0.4</paypal-sdk.version></depe…

mac玩rust用什么画质_Mac上的活动监视器到底有什么用?你会用么?

您希望当Mac卡住或沙滩球不断旋转时&#xff0c;Mac中有一个任务管理器。它允许您强制退出已冻结的网站或应用程序。Windows用户熟悉任务管理器&#xff0c;并且擅长使用它来管理PC任务以优化PC性能。因此&#xff0c;您想知道Mac上是否有任务管理器&#xff1f;是的&#xff0…

js 闭包

一、闭包的作用 实现公有变量 — 函数累加器可以做缓存&#xff08;存储结构&#xff09;可以实现封装&#xff0c;属性私有化模块化开发&#xff0c;防止污染全局变量 闭包实现 1 … 100 function add() {var count 0;function demo() {count;console.log(count);}retur…

java实现 支付宝支付

文章目录支付宝开放平台官网创建demo实例分析效果图实例代码AlipayConfigPaymentControllerOrderService OrderServiceImplapplicationContext-alipay.xml支付宝开放平台官网 用自己手机支付宝扫码登录 根据页面提示填写自己真实信息 进去之后 东西主要用的就在这里 sdk 在 …

python读取git日志_Python获取gitlab提交历史!

工作中的场景&#xff0c;记录下来分享给大家。需求公司私有部署了gitlab保存公司代码&#xff0c;希望在发布系统中可以展示项目在gitlab的提交历史&#xff0c;供发布人员选择提交commit记录并构建对应的docker镜像。不可行的方案但是很快我就发现&#xff0c;这个方案是不可…

js 对象和构造函数

一、对象的创建方法 题外话&#xff1a; java c 同样能生产出对象&#xff0c;但是是死的 JavaScript 生产出的对象是活的&#xff0c;更像是人的生长过程&#xff0c;后天可以增加和删除方法 用字面量创建 var obj {};二、对象的增删改 增 let obj {};obj.name 张三; …

Java接入支付宝支付教程

Java接入支付宝支付教程 一、创建应用 1.登录支付宝开放平台 支付宝开放平台网址&#xff1a;https://open.alipay.com/platform/developerIndex.htm 2.创建一个应用 ? 图1 二 、设置应用密钥 1.下载安装支付宝开放平台助手 软件下载地址&#xff1a;https://gw.alipay…

虚拟同步发电机_测量虚拟同步发电机惯量与阻尼系数的新方法

华北电力大学分布式储能与微网河北省重点实验室的研究人员颜湘武、王俣珂、贾焦心、王德胜、张波&#xff0c;在2019年第7期《电工技术学报》上撰文(论文标题为“基于非线性最小二乘曲线拟合的虚拟同步发电机惯量与阻尼系数测量方法”)指出&#xff0c;虚拟同步发电机(VSG)技术…

对象的包装类

一、首先抛出疑问&#xff1a; 原始值为啥添加属性而且不会报错 &#xff1f;&#xff1f;&#xff1f; var str a; str.name abc; console.log(str.name); // 就是因为原始值要经过包装类 var str abc; str.length 2; // new String(abc).length 2; delete console.lo…

expdp导出 schema_Oracle使用数据泵在异机之间导出导入多个 schema

需求&#xff1a;A机中的oracle有pingchuan和zte两个用户(schema)&#xff0c;这两个schema中都有数据。B机刚装完oracle数据库并建好实例&#xff0c;没有数据。A机的IP为192.168.1.131&#xff0c;B机的IP为192.168.1.137。要求把A机中的pingchuan和zte导入到B机中。(1)A机导…

SpringBoot整合阿里云OSS上传文件

一、需求分析 文件上传是一个非常常见的功能&#xff0c;就是通过IO流将文件写到另外一个地方&#xff0c;这个地方可以是项目下的某个文件夹里&#xff0c;或者是本地电脑某个盘下面&#xff0c;还可以是云服务OSS里面&#xff0c;这里就是我要讲到的OSS&#xff0c;我写的是…

js 原型以及原型链

原型编程的基本规则&#xff1a; 所有的数据都是对象要得到一个对象&#xff0c;不是通过实例化类&#xff0c;而是找到一个对象作为原型并克隆它对象会记住它的原型如果对象无法相应某个请求&#xff0c;它会把这个请求委托给它自己的原型 直接上图 一、继续说说构造函数 …

python tfidf特征变换_使用sklearn提取文本的tfidf特征

from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer, TfidfTransformercorpus [This is the first document.,This is the second second document.,And the third one.,Is this the first document?,]CountVectorizer是通过fit_transform函数将…

SpringBoot整合阿里云OSS文件上传、下载、查看、删除

SpringBoot整合阿里云OSS文件上传、下载、查看、删除 该项目源码地址&#xff1a;https://github.com/ggb2312/springboot-integration-examples &#xff08;其中包含SpringBoot和其他常用技术的整合&#xff0c;配套源码以及笔记。基于最新的 SpringBoot2.1&#xff0c;欢迎各…

js 继承发展史

一、传统模式 – 利用原型链 Grand.prototype.lastName 王五; function Grand() {} var grand new Grand();Father.prototype grand; function Father() {this.name 李四 } var father new Father();Son.prototype father; function Son() {} var son new Son(); conso…

vue 调用webservice_js跨域调用WebService的简单实例

步骤1. 在web.config中的system.web节点里加入步骤2.webservice代码using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Services;using System.Web.Mvc;namespace WebService{/// /// WebService1 的摘要说明/// [WebServic…

SpringBoot整合oss实现文件的上传,查看,删除,下载

springboot整合oss实现文件的上传,查看,删除,下载 1.什么是对象存储 OSS? 答&#xff1a;阿里云对象存储服务&#xff08;Object Storage Service&#xff0c;简称 OSS&#xff09;&#xff0c;是阿里云提供的海量、安全、低成本、高可靠的云存储服务。其数据设计持久性不低…

属性的表示方法和对象的枚举

对象 一、对象.属性 var obj {name : mary,age : 18 };console.log(obj.name, obj.age); // mary 18二、对象[‘属性’] – 让对象属性更加灵活 var zhang {wife1: {name: xiaomei},wife2: {name: xiaoli},wife3: {name: xiaowang},wife4: {name: xiaoxiao},sayWife: funct…

docker 启动成功但无法访问_docker nginx 运行后无法访问的问题解决

## 1最近在学docker部署&#xff0c;一开始打算将nginx先docker化的。对照官方的docker镜像介绍说明&#xff0c;进行自定义配置将官方的nginx.conf复制出来后&#xff0c;修改添加了一些自定义&#xff0c;主要是屏蔽了default.conf&#xff0c;以及include文件夹 sites-avail…

minio实现文件上传下载和删除功能

前言 之前用到文件上传功能&#xff0c;在这里做个学习记录。使用minio实现&#xff0c;后面会记录使用fastdfs和阿里云的oss实现文件上传以及他们的比较&#xff08;oss根据流量收费&#xff09;。minio的中文文档&#xff1a;https://docs.min.io/cn/ minio安装 首先查询d…