大手们,
请问为什么会发生这种事
var i = "123";
alert(i) //123
function x(i){
i = "321";
}
x(i);
alert(i)//321
大手们,
请问为什么会发生这种事
var i = "123";
alert(i) //123
function x(i){
i = "321";
}
x(i);
alert(i)//321
第一个,把全局变量的123传入函数,然后啥事儿没做。全局变量下 i依旧为123.
第二个,执行函数x(),函数x改变了全局变量i的值,改成了321。
这就是有没有形参的区别,第一个你把形参i改成a,b,c之类的没有任何问题。当然对应的你要把函数体内的i也要改变成a,b,c
在js函数执行过程中,函数体内的所有变量首先要在本作用域内找,你会说第一个作用域内没有i啊,但是实际上形参就起到了申明变量的作用。也就是第一个的函数体等于
function x(i) {
var i=i;
i='321'
}
如果在本作用域找不到该变量,则向父作用域查找。这就是第二个函数的结果。
这和js的函数参数传递是值传递有关,第一个函数执行的时候由于传递的只是i的值,所以对全局i没有影响。
第二个由于不是经由参数传递,而是直接引用全局变量,所以修改了全局变量i。
作用域的问题。
不设置参数时,在调用函数时,函数里的i会将全局的i作为函数的值来执行,并将全局作用域的i重新赋值。
设置参数时,i就是函数作用域内部的值,出了函数再用i,当然用的是全局的那个i了。
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答5.1k 阅读✓ 已解决
5 回答1.9k 阅读
第一处中,执行
i="321"
时,解释器就开始去找i了,由内到外,先去函数参数部分找,一找,找到了,那就把参数的那个i给改掉了第二处中,执行
i="321"
时,函数参数部分没找到i,那就继续往外找,在全局找到了一个i,那就把全局的那个i给改掉了如果一直往外找,连在全局都没找到的话,就会报错抛异常了~
还有,第一处的参数传递行为表现得类似于值传参,也就是说,全局i和参数i是两个不同的变量,在调用函数的时候把全局i拷贝到参数i中,之后对参数i不管怎么操作都跟全局i没关系了
我在上文说值传参,其实是不准确的,但是如果你对js比较陌生就暂时先这么理解着好了,省得搞混了。
js的参数实际上传的是引用,那是因为js中,除了布尔、数值等少量类型外,其他类型的变量保存的都是一个引用而非对象本身,这里的引用可以理解为C/C++中的指针
相当于
而在js参数传递中,同样表现出指针的行为:
这其实相当于