JS中全局变量作为函数实参传入的问题
2017-08-27 11:53
369 查看
昨天面试时,被问到了以下的JS代码问题,对比两种情况的输出思考为什么会是这样的结果
被问的时候也是蒙圈的,回来仔细查了相关资料,总结一下,希望也能帮助到你理解这个问题。
看以上两种情况,当全局变量作为函数的实参传入函数之后被重新赋值,然而,执行完函数之后全局变量并没有发生改变,这是为什么?
JS高级程序设计第三版70页有阐述。加上自己的理解总结如下:
原本的b=a有两种赋值方式,一种是按值,另一种是按引用。
ECMAScript中所有的参数传递都是按值传递的,也就是说把函数外部的值复制给函数内部的参数,无论是基本类型还是对象类型,实参和形参都会指向不同的内存地址,并且作用域不同,形参的作用域仅仅在函数体内。
我们看如下代码:
我们看到全局变量a和b,被作为实参传给形参后,函数体内对变量a、b进行了重新的赋值,但是并没有改变全局变量a、b的值,即说明函数体内的a、b赋值都是对形参的赋值,形参与在函数中声明的变量一样有着相同的性质。
但是有一种情况比较特殊,但是不会违背参数按值传递的规律。看如下代码:
再来看如下代码:
对引用数据类型,会发现在函数里,形参被赋值之前,对形参调用引用数据类型的属性(或方法)时,不仅会改变形参,还会改变全局变量。这大概是同名形参和全局变量的一种对应吧,通俗解释一下就是只有当你在函数里被重新赋值之后,你才是独立的。而在这之前我们是穿一条裤子的,属性和方法的调用会同时改变我们。
希望对你有帮助。
第一种情况 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.log(a); // [1,2,3,4]
被问的时候也是蒙圈的,回来仔细查了相关资料,总结一下,希望也能帮助到你理解这个问题。
看以上两种情况,当全局变量作为函数的实参传入函数之后被重新赋值,然而,执行完函数之后全局变量并没有发生改变,这是为什么?
JS高级程序设计第三版70页有阐述。加上自己的理解总结如下:
原本的b=a有两种赋值方式,一种是按值,另一种是按引用。
ECMAScript中所有的参数传递都是按值传递的,也就是说把函数外部的值复制给函数内部的参数,无论是基本类型还是对象类型,实参和形参都会指向不同的内存地址,并且作用域不同,形参的作用域仅仅在函数体内。
我们看如下代码:
var a=[1,2,3], var b=1; function foo(a,b){ a=[4,5,6]; b=2; } 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]
对引用数据类型,会发现在函数里,形参被赋值之前,对形参调用引用数据类型的属性(或方法)时,不仅会改变形参,还会改变全局变量。这大概是同名形参和全局变量的一种对应吧,通俗解释一下就是只有当你在函数里被重新赋值之后,你才是独立的。而在这之前我们是穿一条裤子的,属性和方法的调用会同时改变我们。
希望对你有帮助。
相关文章推荐
- C++ 全局变量作为实参之传递问题
- 1.正则表单验证2.全局变量作为形参传入函数内部操作之后,变量的值在全局上不发生改变的解决方法
- 关于指针作为函数参数传递的理解,对比普通变量作为函数参数的需注意点,其实就是行参和实参的问题。
- js调用方法传递变量作为参数的问题
- 记JSON.stringify的用法(可以传入函数作为参数解决大小写问题)
- js问题-解决定时器不能传入函数参数问题
- 一个js函数中的变量赋值问题
- 关于js函数传入中文字符串参数的取值问题
- 关于函数内部调用全局变量的问题
- js中全局变量的问题
- 关于百度EChart 与dataTables 之间交互问题的解决方案(利用js全局变量)
- Js中有关变量声明和函数声明提升的问题
- JS利用函数修改全局变量
- 多个进程范文DLL中的函数/全局变量/数据共享段问题
- 关于js全局变量数组push数据时dom中无数据的问题
- 全局函数中的static变量问题
- PHP使用部分函数传入乱码作为变量会报错
- 关于android webview读取js全局变量或者函数返回值
- C语言中实参和形参问题&&函数使用数组作为参数的问题
- EasyUI的Model的Model Window,但是遇到一个问题,就是如何把jsp页面中js的变量传入模态框中input的value