Javascript 传递对象时JS闭包不更新null

Javascript 传递对象时JS闭包不更新null,javascript,Javascript,给定带有闭包的代码,当我传递对象时,make\u函数为什么返回null Plnkr: $(文档).ready(所有内容); 函数一切(){ var null_start=null; var object_start={obj:null}; 函数make_函数(arg){ 返回函数(){ d3.选择(“#控制台”) .append('p') .text(JSON.stringify(arg)) .样式(“颜色”、“蓝色”); }; } //生成arg=null的函数 var func=生成函数(空

给定带有闭包的代码,当我传递对象时,
make\u函数
为什么返回
null

Plnkr:

$(文档).ready(所有内容);
函数一切(){
var null_start=null;
var object_start={obj:null};
函数make_函数(arg){
返回函数(){
d3.选择(“#控制台”)
.append('p')
.text(JSON.stringify(arg))
.样式(“颜色”、“蓝色”);
};
}
//生成arg=null的函数
var func=生成函数(空值启动);
d3.选择(“#console”).append('p').text('Expecting null here');
func();
空\u开始={
傅:5,,
酒吧:42
};
d3.选择(“#控制台”)。追加('p')
.html('此处应为{foo:5,bar:42}为什么仍然为空??);
func();
//使用arg={obj:null}生成函数
func=生成函数(对象开始);
d3.select('#console').append('p').text(“此处应为{obj:null}”);
func();
对象_start.obj={
傅:5,,
酒吧:42
};
d3.选择(“#控制台”)。追加('p')
.html('如果更新了此文件,则此处应为{obj:{foo:5,bar:42}}');
func();
}

JavaScript中传递的参数不是通过引用传递的,而是通过一个特殊的“引用副本”传递的。换句话说,当您将
null\u start
传递给
make\u function
时,将传递
null\u start
变量的副本

传递给函数的变量不会反映对
null\u start
变量的更改

这就是为什么使用变量的新值创建另一个函数可以按照示例中的预期工作的原因

请注意,传递对象时,对对象的更改也将由原始变量反映。这是因为对象在JavaScript中是可变的。例如:

function change (obj) { obj.foo = 'bar'; }
var x = {};
change(x);
console.log(x.foo); // 'bar'
这是因为对象只是一个指向值的键框。对象内的键指向值,这些值可以修改,并由函数的外部范围反映出来。但如果我们直接传递值,它将不起作用:

function change (val) { val = 'fff'; }
var x = {foo: 'bar'};
change(x.foo);
console.log(x.foo); // 'bar'

希望有帮助

这只是一个粗略的猜测,但是您是否需要在
d3前面显示
return
。选择
call?是的,因为这将生成一个稍后将被调用的函数。我想让它返回一个函数,而不仅仅是执行一个函数。好吧,我问b/c你没有。但问题显然在别处。
function change (val) { val = 'fff'; }
var x = {foo: 'bar'};
change(x.foo);
console.log(x.foo); // 'bar'