js中变量含(参数、数组)作用域传递问题
js没有块级作用域(你可以自己闭包或其他方法实现),只有函数级作用域和全局作用域,函数外面的变量函数里面可以找到使用,函数里面的变量外面无法访问到。
写这个是因为ES6中的一个例子开始的。首先看下例子
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 10
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 6
这两个实例的区别在于定义i的时候,循环先执行完后,等待调用执行的时候,i才会被赋值给函数体内,等于是循环先给数组赋值完毕后。等待调用。而不是循环的时候就把i的值log出来!
两个例子一个用了var 一个用let定义变量。 let是有块级作用域,因此每次循环体的i都是不同且独立的
上面代码中,变量i
是var
命令声明的,在全局范围内都有效,所以全局只有一个变量i
。
每一次循环,变量i
的值都会发生改变,而循环内被赋给数组a
的函数内部的console.log(i)
,里面的i
指向的就是全局的i
。也就是说,所有数组a
的成员里面的i
,指向的都是同一个i
,不管是循环到第几次,导致运行时输出的都是最后一轮的i
的值,也就是10。
var a=10
function aaa(a){
alert(a);
}
function bbb(){
var a=20;
aaa();
}
bbb();
//---结果输出10 执行函数bbb 里面会执行aaa() aaa里面的alert 里的a 寻找作用域,自身有局部变量的话输出自己,没有的话去aaa的作用域找 上层的var a=10便是。
function aaa(){
var a=b=10
}
// alert(a) //error
alert(b)// 10
var a=b=10这种写法在函数内,b其实是全局变量,a当然是局部变量
执行完aaa(),在全局域里alert(a),当然是undefined,alert(b),就会弹出10
var a=10
function aaa(){
console.log(a)
var a=20
}
aaa() //undefined 变量提升 这个函数执行时等于
var a=10
function aaa(){
var a;
console.log(a)
var a=20
}
在看一个相似的
var a=10
function aaa(){
console.log(a)
a=20
console.log(a)
}
aaa() //10 20
这个吧,就验证了第二条,虽然是就近原则,但是是就近找var声明的变量,这个是因为没有var声明的变量是全局的,这里只是修改了a的值。所以上面就是因为在函数内没找到var的a,于是到外面去找了,一找就找到了,于是a就alert出10了;不过没错的是a=20后,a确实为20了,只不过alert的时候还没有执行到那~~
var a=10
function aaa(){
bbb()
alert(a)
function bbb(){
var a=20
}
}
aaa()// 10
这是因为在alert(a)的时候,bbb函数中的a确实为20 ,可是它对于这时的alert(a)这句话来说是局部的,alert(a)根本找不到bbb函数中的a,所以在aaa函数中它找不到a,于是乎去外面找,一找,就找到了10。
var a=10
function aaa(a){
alert(a);
var a=20
}
aaa(a)
执行过程貌似应该是
var a=10
function aaa(a){
var a;
alert(a);
var a=20
//alert(a);
}
aaa(a)
传递进来的10 赋给变量a alert(10) 之后var a=20 覆盖了之前的10 ,但是函数没有执行到这里就alert结束了。再后面alert(a) //20
传参时,基本类型传值,引用类型传引用。
var a = 5;
var b = a;
b +=3;
alert(a);//5
var a = [1,2,3];
var b=a;
b.push(4);
alert(a);//[1,2,3,4];
变量a 将5这个值传给b b 和a 没有关系了。
数组是引用传递,把b的指针也指向了 同一个地址,所以b的改变 a也改变
var a = [1,2,3];
var b=a;
b=[1,2,3,4]
alert(a) //[1,2,3]
b 被重新赋值后,指针会从新指向自己的内存地址,脱离a。
此外,参数与变量的作用域是相似的:
var a=10;
function aaa(a){
a+=3
}
aaa(a)
alert(a) //10
对比:
var a=10;
function aaa(a){
a+=3;
alert(a) //13
}
aaa(a)
参数传递进去的是值,里面的a是局部变量,不管怎么改都和外面的a 无关。因为不在同一个作用域上。类似:
var a=10
function aaa(a){
alert(a+10)
}
aaa(30) //40
alert(a)//10
var a=[1,2,3]
function aaa(a){
var a=[1,2,3,4]
}
aaa(a)
alert(a)// [1,2,3] 函数里面的a被重新赋值,和外层的a 不指向同一个a
var a=[1,2,3]
function aaa(a){
a.push(4)
}
aaa(a)
alert(a)// [1,2,3,4]
引用改变添加元素后,指向同一个a,引用传递指针,值也变了。
js中变量含(参数、数组)作用域传递问题的更多相关文章
- JS中给函数参数添加默认值(多看课程)
JS中给函数参数添加默认值(多看课程) 一.总结 一句话总结:咋函数里面是可以很方便的获取调用函数的参数的,做个判断就好,应该有简便方法,看课程. 二.JS中给函数参数添加默认值 最近在Codewar ...
- js中变量的声明
大家都知道js中变量的声明是要提前的,下面有4个样例: 1.if(!"t" in window){ var t = 1; } alert(t);答案是undefine ...
- C语言中变量和函数的作用域和链接属性
C语言中变量和函数的作用域和链接属性 作用域 代码块作用域: 代码块指的是使用"{}"包围起来的部分. 在代码块中定义的变量,代码块之外是不能访问的. 代码块嵌套之后的变量作用域, ...
- js中函数的参数为函数的情况即回调函数
js中函数的参数可以是数组对象也可以是函数,当参数为函数时我们叫做回调函数 //定义回调函数function B() { console.log("函数B")setTimeout( ...
- JS中URL编码参数(UrlEncode)
JS中URL编码参数(UrlEncode) 网上有很多文字作品写涉及在JS中呈现类似UrlEncode功能时都是自定义参数来呈现,其实JS中本身就有那样的参数.参数parameter由于用类似URL的 ...
- 【2017-06-27】Js中获取地址栏参数、Js中字符串截取
一.Js中获取地址栏参数 //从地址栏获取想要的参数 function GetQueryString(name) { var reg = new RegExp("(^|&)" ...
- 浅谈JavaScript中的变量、参数、作用域和作用域链
基本类型和引用类型 在JavaScript中有两种数据类型值.基本类型值和引用类型值.基本类型值指的是简单的数据段,而引用类型值指的是可能由多个值构成的对象.在JavaScript中有5种基本数据类型 ...
- JS中变量、作用域的本质,定义及使用方法
全局作用域和局部作用域 全局作用域 局部作用域:函数作用域 全局作用域在全局和局部都可以访问到,局部作用域只能在局部被访问到 var name="cyy"; function fn ...
- js中变量的作用域、变量提升、链式作用域结构
一:作用域 在ES6之前,javascript没有块级作用域(一对{}即为一个块级作用域),只有全局作用域和函数作用域(局部),因此,对应的有全局变量和局部变量.在函数内部可以访问到全局变量,但在函数 ...
随机推荐
- Spring有哪些配置方式
1.XML 配置文件. Bean 所需的依赖项和服务在 XML 格式的配置文件中指定.这些配置文件通常包含许多 bean 定义和特定于应用程序的配置选项.它们通常以 bean 标签开头.例如: < ...
- jdk-8u241各系统版本
今天下载jdk8的时候汇总了linux/mac/windows操作系统的安装包 链接: https://pan.baidu.com/s/105wtrimc1liThGxsZIv7-A 密码: v8lc ...
- Mac下搭建selenium环境
1,安装selenium 打开terminal,使用以下命令安装selenium: pip install -U selenium 2,下载chromedriver,并放在python的安装根目录 ...
- mongDb在node中的操作
mongoDb 干嘛的:数据库,nosql(非关系型|缓存型) 场景:解决大规模数据集合多重数据种类 下载:https://www.mongodb.com/download-center 安装:htt ...
- Vue(八)---组件(Component)
组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码. 注册一个全局组件语法格式如下: Vue.component(tagName, optio ...
- 第二章.学习halcon的准备工作
*图片读取 read_image (Test1, 'C:/Users/Administrator/Desktop/new/Test1.jpg') *文件夹读取 list_files ('C:/User ...
- P1149 火柴棒等式(打表初尝试)
题目描述 给你 n 根火柴棍,你可以拼出多少个形如 “A+B=CA+B=C” 的等式?等式中的 A.B.C 是用火柴棍拼出的整数(若该数非零,则最高位不能是 0).用火柴棍拼数字 0−9 的拼法如图所 ...
- AT1219 歴史の研究[回滚莫队学习笔记]
回滚莫队例题. 这题的意思大概是 设 \(cnt_i\) 为 l ~ r 这个区间 \(i\) 出现的次数 求\(m\) 次询问 求 l~r 的 max {\(a_i\) * \(cnt_i\)} \ ...
- wordpress<=4.6版本任意命令执行漏洞
漏洞简述 当WordPress 使用 PHPMailer 组件向用户发送邮件.攻击者在找回密码时会使用PHPmailer发送重置密码的邮件,利用substr(字符串截取函数).$run(系统调用函数) ...
- 安装JumpServer到CentOS(YUM)
运行环境 系统版本:CentOS Linux release 7.6.1810 (Core) 软件版本:JumpServer-1.4.8 硬件要求:最低2核4GB 官方文档:https://docs. ...