相关文章推荐
玩命的脸盆  ·  JavaScript while 循环 | ...·  1 年前    · 
玩篮球的西装  ·  spring cloud ...·  1 年前    · 

被问的时候也是蒙圈的,回来仔细查了相关资料,总结一下,希望也能帮助到你理解这个问题。

看以上两种情况,当全局变量作为函数的实参传入函数之后被重新赋值,然而,执行完函数之后全局变量并没有发生改变,这是为什么?

JS高级程序设计第三版70页有阐述。加上自己的理解总结如下:

原本的b=a有两种赋值方式,一种是按值,另一种是按引用。
ECMAScript中所有的参数传递都是按值传递的,也就是说把函数外部的值复制给函数内部的参数,无论是基本类型还是对象类型,实参和形参都会指向不同的内存地址,并且作用域不同,形参的作用域仅仅在函数体内。
我们看如下代码:

var a=[1,2,3],
var b=1;
function foo(a,b){
    a=[4,5,6];
foo(a,b);
console.log(a); // [1,2,3]
console.log(b); //1;

我们看到全局变量a和b,被作为实参传给形参后,函数体内对变量a、b进行了重新的赋值,但是并没有改变全局变量a、b的值,即说明函数体内的a、b赋值都是对形参的赋值,形参与在函数中声明的变量一样有着相同的性质。

但是有一种情况比较特殊,但是不会违背参数按值传递的规律。看如下代码:

var a=[1,2,3];
function foo(a){
    a.push(4); //调用引用类型方法,改变了形参a,也改变了全局变量a
    console.log(a); // [1,2,3,4] 此时的a是形参变量的值
    a=[5,6,7];      // 形参重新赋值不会改变全局变量a
    console.log(a); // [5,6,7] 形参变量a
foo(a);
console.log(a); // [1,2,3,4]

再来看如下代码:

var a=[1,2,3];
function foo(a){
    a=[5,6,7]; // 形参a被重新赋值,不会改变全局a
    a.push(4); // 此时只改变了形参a,不会改变全局a
    console.log(a); // [5,6,7,4]
foo(a);
console.log(a); // [1,2,3]

引用数据类型 ,会发现在函数里, 形参被赋值之前 ,对形参调用引用数据类型的 属性(或方法) 时, 不仅会改变形参,还会改变全局变量 。这大概是同名形参和全局变量的一种对应吧,通俗解释一下就是只有当你在函数里被重新赋值之后,你才是独立的。而在这之前我们是穿一条裤子的,属性和方法的调用会同时改变我们。
希望对你有帮助。

昨天面试时,被问到了以下的JS代码问题,对比两种情况的输出思考为什么会是这样的结果第一种情况var a=[1,2,3];function foo(a){ a=[4,5,6];}foo(a);console.log(a); // [1,2,3]第二种情况var a=[1,2,3];function foo(a){ a.push(4);}foo(a);console.
相信你对 全局 变量 一定不陌生,在 函数 作用域里用a=1这种形式定义的 变量 会是一个 全局 变量 ,在 全局 作用域里,用下面3种形式都可以创建对 全局 可见的命名: 代码如下:[removed]var a = 1;b = 2;window.c = 3;[removed]对于b=2这种方式, 它其 和c是一样的,在执行这个赋值语句的时候,会沿着作用域链寻找名字叫做b的 变量 ,一直找到作用域链的顶端还没有找到,于是给window添加一个属性b然后赋值。 var与不var有两个区别: 1 var的 全局 变量 不能被删除,因为delete智能删除对象的可删除的属性,而通过var 定义的 全局 属性会被标明不可删除。需要说明的是,de
JavaScript之 函数 (七):认识JavaScript 函数 函数 的声明和调用、 函数 的递归调用、局部和 全局 变量 函数 表达式的写法、立即执行 函数 使用
Python由荷兰数学和计算机科学研究学会的吉多·范罗苏姆于1990年代初设计,Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本的不断更新和语言新功能的添加,逐渐被人们用于独立的、大型项目的开发和设计 Python解释器易于扩展,可以使用C语言或C++(或者其他可以通过C调用的语言)扩展新的功能和数据类型。Python也可用于可定制化软件 的扩展程序语言。Python丰富的标准库,提供了适用于各个主要系统平台的源码或机器码。 Python还被语言流行指数的编译器Tiobe将它被评为最受欢迎的编程语言,20多年来首次将Python置于Java、C和JavaScript之上,真的非常荣幸了. 自从20世纪90年代初Python语言诞生至2022年,它已被逐渐广泛应用于系统管理任务的处理和Web编程,Python已经成为最受欢迎的程序设计语言之一。 Python教学简单易懂,零基础小白也可以学会,只要你有耐心学习从入门到精通.从小白到高手
就是这种盲目无原理依据的研究测试弄晕了我, 有必要这么做吗? 其 理解了原理就没必要搞这么多一个一个的试, 然后得出规律, ECMAScript规则都已经定义好了. var的规则是: 使用var声明 变量 就是内部 变量 , 否则就是先调用 全局 变量 , 不管多少层 函数 . this的规则是: method 函数 里的this永远指向自身, 普通 函数 的this永远指向DOMWindow. // GodDamnTest1 function Foo() { var a = 123; // 局部 变量 , 所有子 函数 全局 变量 this.a = 456; // 对象属性 (function() { alert(a);
alert(name); 这种方法,即使该 变量 是在一个function内,当该function被执行后它变成了 全局 变量 ---- 但是function不执行它就不被其他function知道,所以最好定义在function外 3.使用window. 变量 名定义
JS 声明 全局 变量 主要分为显式声明或者隐式声明下面分别介绍。 声明方式一: 使用var(关键字)+ 变量 名(标识符)的方式在function外部声明,即为 全局 变量 ,否则在function声明的是局部 变量 。该方式即为显式声明详细如下:<script> var test = 5;// 全局 变量 function a(){ var a = 3;//局部 变量 alert(a)
全局 作用域(window)在下用var/function声明的 变量 函数 内不使用var声明的 变量 (作用域链的 问题 ) 在 函数 内用var连续声明多个 变量 ,后面的 变量 全局 变量 (预解释 问题 ) 在 全局 作用域下和私有作用域下直接给 全局 对象曾加的属性 window.$ = jQuery 在 全局 作用域下用let、const(常量)、class(类)、import(模块)定... 在上面的代码 ,sort_desc 函数 接受三个指针 变量 a、b、c作为 数,然后对它们所指向的 变量 进行排序,最后输出降序排列的结果。在main 函数 ,我们定义了三个整数 变量 x、y、z,并将它们的地址作为 传递给sort_desc 函数 。运行程序后,输出结果为: 3 2 1 这说明sort_desc 函数 成功地对x、y、z进行了降序排列。 <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <button id ="btn">ppp</button> <script> var btn = document.getElementById("btn"); btn.addEventListener("click", function() { var xhr =new XMLHttpRequest() xhr.open("GET", "user.txt", true);//注意路径问题读取data.txt文件的内容。 xhr.send(null); xhr.onreadystatechange = function() { if (xhr.readyState == 4) { if (xhr.status == 200||xhr.status==0) {//请求本地txt文件时状态码是0。 alert(xhr.responseText); } else { alert(xhr.status); }, false) </script> </body> </html> [/code] - 出现了问题 [code=javascript] Access to XMLHttpRequest at 'file:///D:/%E5%89%8D%E7%AB%AF/ja-vaScript%E9%9B%B6%E5%9F%BA%E7%A1%80%E9%80%9A%E5%85%B3%E5%BF%85%E5%A4%87%E8%B5%84%E6%96%99/ [/code] ajax如何请求本地txt文件时 陈海明hack: ajax请求本地的txt文件 win10和ubuntu双系统卸载ubuntu方法 艾玛2018了 煮酒老麦: 所以你们后来是怎么解决的呢?我是输入Mbrfix/drive 0 fixmbr后,先没有删除磁盘分区,想试试重启看什么效果,结果直接显示error loading operating system win10和ubuntu双系统卸载ubuntu方法 计算机视觉_目标检测 煮酒老麦: 我也是,大家千万别这么做