被问的时候也是蒙圈的,回来仔细查了相关资料,总结一下,希望也能帮助到你理解这个问题。
看以上两种情况,当全局变量作为函数的实参传入函数之后被重新赋值,然而,执行完函数之后全局变量并没有发生改变,这是为什么?
JS高级程序设计第三版70页有阐述。加上自己的理解总结如下:
原本的b=a有两种赋值方式,一种是按值,另一种是按引用。
ECMAScript中所有的参数传递都是按值传递的,也就是说把函数外部的值复制给函数内部的参数,无论是基本类型还是对象类型,实参和形参都会指向不同的内存地址,并且作用域不同,形参的作用域仅仅在函数体内。
我们看如下代码:
var a=[1,2,3],
var b=1;
function foo(a,b)
console.log(a);
console.log(b);
我们看到全局变量a和b,被作为实参传给形参后,函数体内对变量a、b进行了重新的赋值,但是并没有改变全局变量a、b的值,即说明函数体内的a、b赋值都是对形参的赋值,形参与在函数中声明的变量一样有着相同的性质。
但是有一种情况比较特殊,但是不会违背参数按值传递的规律。看如下代码:
var a=[1,2,3];
function foo(a){
a.push(4);
console.log(a);
a=[5,6,7];
console.log(a);
foo(a);
console.log(a);
再来看如下代码:
var a=[1,2,3];
function foo(a){
a=[5,6,7];
a.push(4);
console.log(a);
foo(a);
console.log(a);
对
引用数据类型
,会发现在函数里,
形参被赋值之前
,对形参调用引用数据类型的
属性(或方法)
时,
不仅会改变形参,还会改变全局变量
。这大概是同名形参和全局变量的一种对应吧,通俗解释一下就是只有当你在函数里被重新赋值之后,你才是独立的。而在这之前我们是穿一条裤子的,属性和方法的调用会同时改变我们。
希望对你有帮助。
昨天面试时,被问到了以下的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:
win10和ubuntu双系统卸载ubuntu方法
艾玛2018了
win10和ubuntu双系统卸载ubuntu方法
计算机视觉_目标检测