为什么输出的是1

题目描述

图片描述

题目来源及自己的思路

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)

var obj = {a:1};
function fun (obj){
    obj = {a:2}
}
fun(obj)
console.log(obj)

你期待的结果是什么?实际看到的错误信息又是什么?

为什么输出的是{a:1}呢?
函数里的 obj 没var声明 不是应该作为全局变量提升的吗?

阅读 3.1k
6 个回答

其实如果你能弄清楚VO, AO作用域链这些概念你就能够弄清楚为什么会是这个样子。
AO是在函数执行的时候被创建的,包括

  • 函数的所有形参
  • 所有函数声明
  • 所有变量声明

当你执行fun这个函数的时候,它的活动对象

AO = {
  obj: {a: 1}
}
   

obj已经被声明,所以它不会在向上去查询父作用域的变量对象

具体的文章,请参考

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}

function fun(obj){}
等于
function fun(){var obj;}
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

这个写法obj是形参,只在函数内有效,不会影响到函数外面的obj

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题