关于JavaScript全局作用域和函数作用域的拙见
在类c的语言中,用{}引起来的部分称为块级作用域,而在JS中没有块级作用域
作用域:一个变量作用的范围;中Js中一共有两种作用:
- 全局作用域
- 直接编写在script标签中的JS代码,都在全局作用域中
-全局作用域在页面打开时创建,在页面关闭时销毁
-在全局作用域中有一个全局对象window,它代表的是一个浏览器窗口,它由浏览器创建,我们可以直接使用
-在全局作用域中,创建的变量都会作为window对象的属性保存,创建的函数都会作为window对象的方法保存
- 变量的声明提升
-使用var关键字声明的变量,会在所有代码执行之前声明(但是不会赋值
-但是如果声明变量不适用var关键字,则变量不会声明提前
- 函数的声明提前
-使用函数声明形式创建的函数function 函数(){}
它会在所有代码执行之前就被创建,所以我们可以在函数声明前来调用
-使用函数表达式创建的函数,不会被声明提前,所有不能提前调用
全局作用域的变量都是全局变量,可以在页面的任意部分都可以访问到
- 函数作用域
-调用函数时创建函数作用域,函数执行完毕以后,函数作用域销毁,
-每调用一次函数就会创建一个新的函数作用域,她们之间是相会独立的
-函数作用域中可以访问到全局作用域的变量,在全局作用域中,不能访问函数作用域的的变量
-当在函数作用域中操作一个变量时,它会先在自身作用域中寻找,若有就直接使用,若没有就向上一级作用域中寻找,直到全局作用域中
-在函数作用域中想访问全局中的变量,则可以用window
-在函数作用域中,使用var关键字声明的变量,会在函数中所有代码执行之前被声明
-在函数中,不使用var声明的变量都会成为全局变量
-定义形參,相当于函数作用域中声明了变量
var a=10;
function fun(){
alert(a);
var a=2;
}
fun();//undifined,变量提升,但没赋值
alert(a);//10,a修改的局部的a
var a=10;
function fun(){
alert(a);
a=2;
}
fun();//10
alert(a);//2
var a=10;
function fun(a){
alert(a);
a=2;
}
fun();//undifined
alert(a);//10
var a=10;
function fun(a){
alert(a);
a=2;
}
fun(123);//123
alert(a);//10
function fun(){
a=10;
}
fun() alert(a);//a=10,变成了全局变量
作用域链:
函数对象和其他对象一样,拥有可以通过代码访问的属性和一系列供JS引擎访问的内部属性,其中一个内部属性是[[Scope]],该内部属性包含了函数被创建的作用域中对象的集合,这个集合被称为函数的作用域链,它决定了哪些数据能被函数访问。
当一个函数创建后,它保存着一个作用域链,并且这个作用域链会被创建此函数的作用域中可访问的数据对象填充。
function func(){
var num=;
alert(num)
}
func();
在函数func创建时,它的作用域链会填入一个全局对象,该全局对象包含了所有全局变量,
执行此函数会创建一个称为“运行期上下文”的内部对象,运行期上下文定义了函数执行的环境。每个运行期上下文都有自己的作用域链,用于标识符解析,当运行期上下文被创建时,而它的作用域链初始化为当前运行的函数的[[Scope]]所包含的对象
这些值按照他们出现在函数中的顺序被复制到运行期上下文的作用域链中。它们共同组成了一个新的对象,叫“活动对象”,该对象包含了函数的所有局部变量,命名参数,参数集合以及this,然后此对象会被推入作用域链的前端。当运行期上下文被销毁,活动对象也随之被销毁,新的作用域如下:
关于JavaScript全局作用域和函数作用域的拙见的更多相关文章
- 《你不知道的javascript》一、函数作用域和块作用域
函数中的作用域 所谓函数作用域,就是属于这个函数的全部变量都可以在整个函数的范围内使用及复用. function foo(a) { var b=a; function bar(c){ var c=b* ...
- javascript篇-----函数作用域,函数作用域链和声明提前
在一些类似C语言的编程语言中,花括号内的每一段代码都具有各自的作用域,而且变量在声明它们的代码段之外是不可见的(也就是我们不能在代码段外直接访问代码段内声明的变量),我们称之为块级作用域,然而,不同于 ...
- Javascript中的词法作用域、动态作用域、函数作用域和块作用域(四)
一.js中的词法作用域和动态作用域 词法作用域也就是在词法阶段定义的作用域,也就是说词法作用域在代码书写时就已经确定了. js中其实只有词法作用域,并没有动态作用域,this的执 ...
- js变量的作用域与函数作用域
引自 1. 变量的作用域(var与let的区别) 在函数之外声明的变量,叫做全局变量,因为它可被当前文档中的任何其他代码所访问.在函数内部声明的变量,叫做局部变量,因为它只能在当前函数的内部访问. E ...
- JavaScript变量的作用域和函数的作用域的区别
变量作用域和函数作用域都涉及到变量值的变化,本文旨在让大家明白他们之间的区别 变量的作用域: 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接 ...
- 开心菜鸟系列----函数作用域(javascript入门篇)
1 <!DOCTYPE html> 2 <html> 3 <script src="./jquery-1.7.2.js"></ ...
- 从函数作用域和块级作用域看javascript的作用域链
在ES6之前,javascript只有全局作用域和函数作用域.所谓作用域就是一个变量定义并能够被访问到的范围.也就是说如果一个变量定义在全局(window)上,那么在任何地方都能访问到这个变量,如果这 ...
- javascript中函数作用域和声明提前
javascript不像java等其他强类型语句,没有块级作用域(括号内的代码都有自己的作用域,变量在声明它们的代码段之外不可见)一说,但有自己的独特地方,即函数作用域. 函数作用域:变量在声明它们的 ...
- 谈谈javascript的函数作用域
在一些类似c语言的编程语言中,花括号内的每一段代码都具有各自的作用域,而且变量在声明他们的代码段之外是不可见的,我们称为块级作用域(block scope),而javascript中没有块级作用域.取 ...
随机推荐
- Android Data Binding Library
Data Binding Library Data Binding Library是一个支持库,允许您使用声明格式(而不是编程)将布局中的UI组件与应用程序中的数据源绑定. 布局通常在调用UI框架方法 ...
- 混合式应用真机调试(Android Studio + Chrome)
如何在chrome上调试混合式APP https://developers.google.com/web/tools/chrome-devtools/remote-debugging/ Get Sta ...
- 前后台交互实现点击超链接通过指定的 url 去网络或者文件服务器下载文件
前台 VUE 界面: <el-table-column prop="attachment" align="center" label="附件详情 ...
- nginx 和 php超时设置
nginx.conf --- http节: keepalive_timeout 600; #客户端浏览器超时时间fastcgi_connect_timeout 600; #php-fpm连接超时时间 ...
- 切换用户身份su与sudo
普通用户切换到root用户的方式有:su和sudo. 1,su - (su为switch user,即切换用户的简写) 格式:su -l USERNAME(-l为login,即登陆的简写) -l可以将 ...
- U盘无法访问
U盘无法访问 方法/步骤 首先,Win+R,打开“运行”窗口. 在打开的运行窗口中,输入cmd回车 这时会打开这样的一个窗口 这时输入chkdsk g: /f 需要说明的是,g这个 ...
- python玩丢手绢问题,出局的顺序
# 丢手绢问题# 游戏规则: 有N个小朋友玩丢手绢游戏,做成一圈,从第一个小朋友开始数数,从一开始数,数到指定数字的小朋友要出列,然后下一个小朋友继续从1开始数,依次类推,算出最后一个留下来的小朋友是 ...
- Hydra密码破译工具
Hydra简介 Hydra是著名黑客组织thc开发的一款开源的暴力密码破解工具,可以在线破解多种密码,目前已经被Backtrack和kali等渗透平台收录.除了命令行下的Hydra外,还提供了Hydr ...
- Angular2 web project UltraRacing (一,如何启动一个Angular项目?)
要稍等一会 切到目录看看 OK,生成很多文件 那么 我们来启动吧 出现下面信息说明成功 而且每次我们编译文件后 都会在cmd里面显示这个信息 说明他是热部署的 然后我们去浏览器看看 说明一切OK!
- git 先建立本地分支,再传给线上库
cd 进入本地一个文件夹 git clone 文件下来 进入右下角 develop分支(remote braches) 新建分支 (check out) a 把新分支 a 传上线上 新建一个对立 ...