对比两处,有个疑惑,为什么把a当作参数传入以后 a值在全局中没有变化呢?
var a = 1;
function b(){
a = 2;
console.log(a); //2
}
b();
console.log(a); //2
var a = 1;
function b(a){ //此处有传参
a = 2;
console.log(a); //2
}
b();
console.log(a); //1 ?
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
基本类型只传值。
函数参数声明会函数作用域中的覆盖同名变量引用
楼主想要实现所述的功能,应该这样把他们区分出来,这涉及到一些变量命名的规范等等,在开发中应该是有相关约定的,同名覆盖的事情应该避免
对于这种故意弄出来整我们新人的题目,我真是恨透了。
谁脑残会写出这种给传入参数重新赋值的函数啊?有什么用吗?
我们知道,传入的参数,都会代表一个具体的值,可能是数值,字符串,数组,函数,对象等。可是有谁见过把传入的参数当成变量还要接受别人重新赋值的用法啊?
这个b函数中的参数a,和函数体中
a=2的a,到底是不是同一个a啊?假如换个参数传入呢是不是结果和题主第一个例子又一样了啊。
如果我们这样调用
b(4);b函数难道就会变成这样?
当然别人设计编程语言的时候也会想到总有一些神经病的人会做这些可怕的事情,只好对这种情况做一个特殊处理了。
当传入参数的值在函数声明的作用域中已经存在时,作用域中该变量的值,不会在函数体中被修改。
比如我们常见的window对象
运行后window指向任然不变。
以及jQUery源码中
因此个人理解是,没有什么为什么,就是javascript在设计之初,对这种情况的一个特殊处理。防止程序员乱来。
var a = 1;
function b(a){ //此处有传参
a = 2;
console.log(a); //2
}
b();
console.log(a); //1 ?
这里是按值传递,两个a并不是同一个变量
题主应该是学生,说多了你难理解。这种题目考察两个重要知识点:变量作用域、值传递和引用传递。请自己百度加深理解。
这应该涉及到javascript作用域链和活动对象。
每调用一次函数,就会创建一个函数上下文。在函数上下文里面有个作用域和活动对象。活动对象包含函数内部的变量,函数定义声明,和函数参数。
var a = 1;
function b(){
a = 2;
console.log(a); //2
}
b();
console.log(a); //2