题目描述
题目来源及自己的思路
相关代码
// 请把代码文本粘贴到下方(请勿用图片代替代码)
var obj = {a:1};
function fun (obj){
obj = {a:2}
}
fun(obj)
console.log(obj)
你期待的结果是什么?实际看到的错误信息又是什么?
为什么输出的是{a:1}呢?
函数里的 obj 没var声明 不是应该作为全局变量提升的吗?
// 请把代码文本粘贴到下方(请勿用图片代替代码)
var obj = {a:1};
function fun (obj){
obj = {a:2}
}
fun(obj)
console.log(obj)
为什么输出的是{a:1}呢?
函数里的 obj 没var声明 不是应该作为全局变量提升的吗?
var obj = {a:1};
function fun (obj){
console.log(arguments);
obj = {a:2}
}
fun(obj)
console.log(obj)
试试这个就明白了
var obj = {a:1};
function fun (obj){
obj = {a:2}
}
fun(obj)
console.log(obj)
这段代码不太好,容易让人把作用域啊地址引用之类的问题放在一起考虑导致搞不清楚.
1.参数接收了参数之后,就已经声明了,不需要手动显示声明,这个你回忆一下见过的函数就知道了,所以这两个obj是两个变量不是一个.
2.函数内部的obj和外边的obj是两个变量,在你第二次赋值之前,两个变量指向了同一条数据{a:1}.但是你将内部的obj重新赋值了,而不是在原值上修改,这样外部的obj没有收到影响,输出结果不变.
如果函数内部你选择obj.a = 2
,输出结果就会变成{a:2}
var obj = {a:1};
function fun (){
obj = {a:2}
}
fun();
console.log(obj);
这样才是输出 Object a: 2
函数的参数也是局部变量;
var obj = {a:1};
function fun (obj){
this.obj = {a:2};
}
fun(obj);
console.log(obj);
或者这样也是输出 Object a: 2
10 回答11.2k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
其实如果你能弄清楚
VO
,AO
和作用域链
这些概念你就能够弄清楚为什么会是这个样子。AO
是在函数执行的时候被创建的,包括当你执行fun这个函数的时候,它的活动对象
obj
已经被声明,所以它不会在向上去查询父作用域的变量对象具体的文章,请参考